和许多人一样,我在疫情期间一直在探索许多新的电视节目。我最近发现了一个英国游戏节目,叫做 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 个——还不错! 但是我找到了这种使用每个随机数最多一次来计算精确数字的方法
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
试试 倒计时 数字游戏,并在评论中告诉我们您玩得怎么样。
13 条评论