和许多人一样,在疫情期间我一直在探索许多新的电视节目。我最近发现了一个英国游戏节目,名为 Countdown,参赛者玩两种类型的游戏:文字游戏,他们尝试用一组混乱的字母组成最长的单词;以及数字游戏,他们从随机选择的数字中计算出目标数字。因为我喜欢数学,所以我发现自己被数字游戏所吸引。
数字游戏可以为您的下一个家庭游戏之夜增添乐趣,因此我想分享我自己的变体。您从一组随机数字开始,这些数字分为 1 到 10 的“小”数字,以及 15、20、25,依此类推直到 100 的“大”数字。您可以从大小数字中选择任意六个数字的组合。
接下来,您生成一个介于 200 到 999 之间的随机“目标”数字。然后使用您的六个数字进行简单的算术运算,尝试计算目标数字,每个“小”数字和“大”数字最多使用一次。如果您准确计算出目标数字,您将获得最高分,如果您能达到目标数字的 10 以内,则得分较低。
例如,如果您的随机数字是 75、100、2、3、4 和 1,而您的目标数字是 505,您可能会说 2+3=5、5×100=500、4+1=5,以及 5+500=505。或者更直接地说:(2+3)×100 + 4 + 1 = 505。
在命令行上随机化列表
我发现在家玩这个游戏的最佳方式是从 1 到 10 的池中抽取四个“小”数字,并从 15 到 100 的 5 的倍数中抽取两个“大”数字。您可以使用 Linux 命令行来为您创建这些随机数字。
让我们从“小”数字开始。我希望这些数字的范围在 1 到 10 之间。您可以使用 Linux seq
命令生成数字序列。您可以以几种不同的方式运行 seq
,但最简单的形式是为序列提供起始数字和结束数字。要生成从 1 到 10 的列表,您可以运行此命令
$ seq 1 10
1
2
3
4
5
6
7
8
9
10
要随机化此列表,您可以使用 Linux shuf
(“shuffle”)命令。shuf
将随机化您给它的任何内容的顺序,通常是一个文件。例如,如果您将 seq
命令的输出发送到 shuf
命令,您将收到一个 1 到 10 之间的随机数字列表
$ seq 1 10 | shuf
3
6
8
10
7
4
5
2
1
9
要从 1 到 10 的列表中仅选择四个随机数字,您可以将输出发送到 head
命令,该命令会打印出其输入的前几行。使用 -4
选项指定 head
应该只打印前四行
$ seq 1 10 | shuf | head -4
6
1
8
4
请注意,此列表与之前的示例不同,因为 shuf
每次都会生成一个随机顺序。
现在您可以执行下一步来生成“大”数字的随机列表。第一步是生成一个可能的数字列表,从 15 开始,以 5 递增,直到达到 100。您可以使用 Linux seq
命令生成此列表。要将每个数字递增 5,请为 seq
命令插入另一个选项以指示步长
$ seq 15 5 100
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
就像之前一样,您可以随机化此列表并选择两个“大”数字
$ seq 15 5 100 | shuf | head -2
75
40
使用 Bash 生成随机数
我想您可以使用类似的方法从 200 到 999 的范围内选择游戏的目标数字。但是生成单个随机值的最简单解决方案是直接在 Bash 中使用 RANDOM
变量。当您引用此内置变量时,Bash 会生成一个大的随机数。要将其放在 200 到 999 的范围内,您需要先将随机数放在 0 到 799 的范围内,然后再加 200。
要将随机数放入以 0 开头的特定范围,您可以使用模算术运算。模运算计算两个数字相除后的余数。如果我从 801 开始并除以 800,结果是 1,余数为 1(模为 1)。将 800 除以 800 得到 1,余数为 0(模为 0)。将 799 除以 800 得到 0,余数为 799(模为 799)。
Bash 支持使用 $(( ))
构造进行算术扩展。在双括号之间,Bash 将对您提供的值执行算术运算。要计算 801 除以 800 的模,然后加 200,您将键入
$ echo $(( 801 % 800 + 200 ))
201
通过该操作,您可以计算出 200 到 999 之间的随机目标数字
$ echo $(( RANDOM % 800 + 200 ))
673
您可能想知道为什么我在 Bash 语句中使用了 RANDOM
而不是 $RANDOM
。在算术扩展中,Bash 将自动扩展双括号内的任何变量。您不需要在 $RANDOM
变量上使用 $
来引用变量的值,因为 Bash 会为您执行此操作。
玩数字游戏
让我们把所有这些放在一起玩数字游戏。生成两个随机“大”数字、四个随机“小”值和目标值
$ seq 15 5 100 | shuf | head -2
75
100
$ seq 1 10 | shuf | head -4
4
3
10
2
$ echo $(( RANDOM % 800 + 200 ))
868
我的数字是 75、100、4、3、10 和 2,我的目标数字是 868。
如果我使用每个“小”数字和“大”数字最多一次进行以下算术运算,我可以接近目标数字
10×75 = 750
750+100 = 850
and:
4×3 = 12
850+12 = 862
862+2 = 864
只差四位——还不错! 但我找到了这种使用每个随机数最多一次来计算确切数字的方法
4×2 = 8
8×100 = 800
and:
75-10+3 = 68
800+68 = 868
或者我可以执行这些计算来准确获得目标数字。这仅使用了六个随机数字中的五个
4×3 = 12
75+12 = 87
and:
87×10 = 870
870-2 = 868
尝试一下 Countdown 数字游戏,并在评论中告诉我们您玩得怎么样。
13 条评论