Linux中國

用 Linux 命令玩一個有趣的數學遊戲

像許多人一樣,我在大流行期間看了不少新的電視節目。我最近發現了一個英國的遊戲節目,叫做 Countdown,參賽者在其中玩兩種遊戲:一種是 單詞 遊戲,他們試圖從雜亂的字母中找出最長的單詞;另一種是 數字 遊戲,他們從隨機選擇的數字中計算出一個目標數字。因為我喜歡數學,我發現自己被數字遊戲所吸引。

數字遊戲可以為你的下一個家庭遊戲之夜增添樂趣,所以我想分享我自己的一個遊戲變體。你以一組隨機數字開始,分為 1 到 10 的「小」數字和 15、20、25,以此類推,直到 100 的「大」數字。你從大數字和小數字中挑選六個數字的任何組合。

接下來,你生成一個 200 到 999 之間的隨機「目標」數字。然後用你的六個數字進行簡單的算術運算,嘗試用每個「小」和「大」數字計算出目標數字,但使用不能超過一次。如果你能準確地計算出目標數字,你就能得到最高分,如果距離目標數字 10 以內就得到較低的分數。

例如,如果你的隨機數是 75、100、2、3、4 和 1,而你的目標數是 505,你可以說 2+3=55×100=5004+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

我的數字是 7510043102,而我的目標數字是 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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國