用 Linux 命令玩一個(gè)有趣的數(shù)學(xué)游戲
在家玩流行的英國游戲節(jié)目 “Countdown” 中的數(shù)字游戲。
像許多人一樣,我在大流行期間看了不少新的電視節(jié)目。我最近發(fā)現(xiàn)了一個(gè)英國的游戲節(jié)目,叫做 Countdown,參賽者在其中玩兩種游戲:一種是 單詞 游戲,他們?cè)噲D從雜亂的字母中找出最長(zhǎng)的單詞;另一種是 數(shù)字 游戲,他們從隨機(jī)選擇的數(shù)字中計(jì)算出一個(gè)目標(biāo)數(shù)字。因?yàn)槲蚁矚g數(shù)學(xué),我發(fā)現(xiàn)自己被數(shù)字游戲所吸引。
數(shù)字游戲可以為你的下一個(gè)家庭游戲之夜增添樂趣,所以我想分享我自己的一個(gè)游戲變體。你以一組隨機(jī)數(shù)字開始,分為 1 到 10 的“小”數(shù)字和 15、20、25,以此類推,直到 100 的“大”數(shù)字。你從大數(shù)字和小數(shù)字中挑選六個(gè)數(shù)字的任何組合。
接下來,你生成一個(gè) 200 到 999 之間的隨機(jī)“目標(biāo)”數(shù)字。然后用你的六個(gè)數(shù)字進(jìn)行簡(jiǎn)單的算術(shù)運(yùn)算,嘗試用每個(gè)“小”和“大”數(shù)字計(jì)算出目標(biāo)數(shù)字,但使用不能超過一次。如果你能準(zhǔn)確地計(jì)算出目標(biāo)數(shù)字,你就能得到最高分,如果距離目標(biāo)數(shù)字 10 以內(nèi)就得到較低的分?jǐn)?shù)。
例如,如果你的隨機(jī)數(shù)是 75、100、2、3、4 和 1,而你的目標(biāo)數(shù)是 505,你可以說 2+3=5
,5×100=500
,4+1=5
,以及 5+500=505
?;蛘吒苯拥兀?code>(2+3)×100 + 4 + 1 = 505。
在命令行中隨機(jī)化列表
我發(fā)現(xiàn)在家里玩這個(gè)游戲的最好方法是從 1 到 10 的池子里抽出四個(gè)“小”數(shù)字,從 15 到 100 的 5 的倍數(shù)中抽出兩個(gè)“大”數(shù)字。你可以使用 Linux 命令行來為你創(chuàng)建這些隨機(jī)數(shù)。
讓我們從“小”數(shù)字開始。我希望這些數(shù)字在 1 到 10 的范圍內(nèi)。你可以使用 Linux 的 seq
命令生成一個(gè)數(shù)字序列。你可以用幾種不同的方式運(yùn)行 seq
,但最簡(jiǎn)單的形式是提供序列的起始和結(jié)束數(shù)字。要生成一個(gè)從 1 到 10 的列表,你可以運(yùn)行這個(gè)命令:
$ seq 1 10
1
2
3
4
5
6
7
8
9
10
為了隨機(jī)化這個(gè)列表,你可以使用 Linux 的 shuf
(“shuffle”,打亂)命令。shuf
將隨機(jī)化你給它的東西的順序,通常是一個(gè)文件。例如,如果你把 seq
命令的輸出發(fā)送到 shuf
命令,你會(huì)收到一個(gè) 1 到 10 之間的隨機(jī)數(shù)字列表:
$ seq 1 10 | shuf
3
6
8
10
7
4
5
2
1
9
要從 1 到 10 的列表中只選擇四個(gè)隨機(jī)數(shù),你可以將輸出發(fā)送到 head
命令,它將打印出輸入的前幾行。使用 -4
選項(xiàng)來指定 head
只打印前四行:
$ seq 1 10 | shuf | head -4
6
1
8
4
注意,這個(gè)列表與前面的例子不同,因?yàn)?nbsp;shuf
每次都會(huì)生成一個(gè)隨機(jī)順序。
現(xiàn)在你可以采取下一步措施來生成“大”數(shù)字的隨機(jī)列表。第一步是生成一個(gè)可能的數(shù)字列表,從 15 開始,以 5 為單位遞增,直到達(dá)到 100。你可以用 Linux 的 seq
命令生成這個(gè)列表。為了使每個(gè)數(shù)字以 5 為單位遞增,在 seq
命令中插入另一個(gè)選項(xiàng)來表示 步進(jìn):
$ seq 15 5 100
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
就像以前一樣,你可以隨機(jī)化這個(gè)列表,選擇兩個(gè)“大”數(shù)字:
$ seq 15 5 100 | shuf | head -2
75
40
用 Bash 生成一個(gè)隨機(jī)數(shù)
我想你可以用類似的方法從 200 到 999 的范圍內(nèi)選擇游戲的目標(biāo)數(shù)字。但是生成單個(gè)隨機(jī)數(shù)的最簡(jiǎn)單的方案是直接在 Bash 中使用 RANDOM
變量。當(dāng)你引用這個(gè)內(nèi)置變量時(shí),Bash 會(huì)生成一個(gè)大的隨機(jī)數(shù)。要把它放到 200 到 999 的范圍內(nèi),你需要先把隨機(jī)數(shù)放到 0 到 799 的范圍內(nèi),然后加上 200。
要把隨機(jī)數(shù)放到從 0 開始的特定范圍內(nèi),你可以使用模數(shù)算術(shù)運(yùn)算符。模數(shù)計(jì)算的是兩個(gè)數(shù)字相除后的 余數(shù)。如果我用 801 除以 800,結(jié)果是 1,余數(shù)是 1(模數(shù)是 1)。800 除以 800 的結(jié)果是 1,余數(shù)是 0(模數(shù)是 0)。而用 799 除以 800 的結(jié)果是 0,余數(shù)是 799(模數(shù)是 799)。
Bash 通過 $(())
結(jié)構(gòu)支持算術(shù)展開。在雙括號(hào)之間,Bash 將對(duì)你提供的數(shù)值進(jìn)行算術(shù)運(yùn)算。要計(jì)算 801 除以 800 的模數(shù),然后加上 200,你可以輸入:
$ echo $(( 801 % 800 + 200 ))
201
通過這個(gè)操作,你可以計(jì)算出一個(gè) 200 到 999 之間的隨機(jī)目標(biāo)數(shù):
$ echo $(( RANDOM % 800 + 200 ))
673
你可能想知道為什么我在 Bash 語句中使用 RANDOM
而不是 $RANDOM
。在算術(shù)擴(kuò)展中, Bash 會(huì)自動(dòng)擴(kuò)展雙括號(hào)內(nèi)的任何變量. 你不需要在 $RANDOM
變量上的 $
來引用該變量的值, 因?yàn)?Bash 會(huì)幫你做這件事。
玩數(shù)字游戲
讓我們把所有這些放在一起,玩玩數(shù)字游戲。產(chǎn)生兩個(gè)隨機(jī)的“大”數(shù)字, 四個(gè)隨機(jī)的“小”數(shù)值,以及目標(biāo)值:
$ seq 15 5 100 | shuf | head -2
75
100
$ seq 1 10 | shuf | head -4
4
3
10
2
$ echo $(( RANDOM % 800 + 200 ))
868
我的數(shù)字是 75、100、4、3、10 和 2,而我的目標(biāo)數(shù)字是 868。
如果我用每個(gè)“小”和“大”數(shù)字做這些算術(shù)運(yùn)算,并不超過一次,我就能接近目標(biāo)數(shù)字了:
10×75 = 750
750+100 = 850
然后:
4×3 = 12
850+12 = 862
862+2 = 864
只相差 4 了,不錯(cuò)!但我發(fā)現(xiàn)這樣可以用每個(gè)隨機(jī)數(shù)不超過一次來計(jì)算出準(zhǔn)確的數(shù)字:
4×2 = 8
8×100 = 800
然后:
75-10+3 = 68
800+68 = 868
或者我可以做 這些 計(jì)算來準(zhǔn)確地得到目標(biāo)數(shù)字。這只用了六個(gè)隨機(jī)數(shù)中的五個(gè):
4×3 = 12
75+12 = 87
然后:
87×10 = 870
870-2 = 868
試一試 Countdown 數(shù)字游戲。