用 Linux 命令玩一個有趣的數學遊戲
像許多人一樣,我在大流行期間看了不少新的電視節目。我最近發現了一個英國的遊戲節目,叫做 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
然後:
4×3 = 12
850+12 = 862
862+2 = 864
只相差 4 了,不錯!但我發現這樣可以用每個隨機數不超過一次來計算出準確的數字:
4×2 = 8
8×100 = 800
然後:
75-10+3 = 68
800+68 = 868
或者我可以做 這些 計算來準確地得到目標數字。這只用了六個隨機數中的五個:
4×3 = 12
75+12 = 87
然後:
87×10 = 870
870-2 = 868
試一試 Countdown 數字遊戲,並在評論中告訴我們你做得如何。
via: https://opensource.com/article/21/4/math-game-linux-commands
作者:Jim Hall 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive