使用 Linux 命令玩有趣的数学游戏
在家玩英国流行游戏节目“倒计时”中的数字游戏。
和许多人一样,我在大流行期间一直在探索许多新的电视节目。我最近发现了一个名为倒计时的英国游戏节目,其中参赛者玩两种类型的游戏:单词游戏,他们试图从一堆字母中拼出最长的单词,以及一个数字游戏,他们从随机选择的数字中计算出目标数字。因为我喜欢数学,所以我发现自己被数字游戏所吸引。
数字游戏可以为您的下一个家庭游戏之夜增添乐趣,所以我想分享我自己的游戏变体。您从一组随机数字开始,分为 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 的五的倍数中取出两个“大”数字。您可以使用 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 开始的特定范围内,可以使用取模算术运算。 Modulo 计算两个数字相除后的余数。如果我从 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
尝试一下倒计时数字游戏,并在评论中告诉我们您的表现。