如果我運行./random.sh 10 45
,它只會返回10
和45
之間的隨機數。生成符合Bash範圍的隨機數
我能夠生產使用
randomNumber=$((1 + RANDOM % 100))
,但現在我怎麼能允許用戶指定隨機數的上限和下限的隨機數?
如果我運行./random.sh 10 45
,它只會返回10
和45
之間的隨機數。生成符合Bash範圍的隨機數
我能夠生產使用
randomNumber=$((1 + RANDOM % 100))
,但現在我怎麼能允許用戶指定隨機數的上限和下限的隨機數?
您可以使用shuf
#!/bin/bash
# $1: Lower limit
# $2: Upper limit
# Todo Check arguments
shuf -i $1-$2 -n 1
./random.sh 45 50
請嘗試以下(純BASH):
low=10
hgh=45
rand=$((low + RANDOM%(1+hgh-low)))
的想法是設置範圍在下界默認,說10
,有更高的界限,說45
。所以你調整下限是這樣的:$RANDOM % 45 + 10
,不是嗎?
但沒有與此解決的問題,它假定你將永遠是0 + 10
和45
之間,其實它的工作原理,直到你達到35(35 + 10 = 45
你的上界),比了將35
出你的界限。
爲了留在範圍內的解決方案是做$RANDOM % (higher_b - lower_b)
,這將讓你留在更高勢必再增加下界它給你:
$RANDOM % (45 -10) + 10
例如錯誤的輸出:
for i in {0..10};do printf $[RANDOM % 45 + 10]" ";done
47 31 53 23 36 10 22 36 11 25 54
例如右輸出:
for i in {0..10};do printf $[RANDOM % 35 +10]" ";done
39 44 14 12 38 31 25 13 42 33 16
你也可以寫RANDOM % (higher - lower +1)
如果你想讓你的索引包含更高的界限。
modulo的問題是$RANDOM % N
,除非N是2的冪,對於所有結果不具有相等的概率分佈:How to generate random number in Bash?。每man bash
,$RANDOM
產生一個介於0和32,767之間的數字(2 ** 15-1)。這在某些情況下可能並不重要,但通過稍微重寫表達式,我們可以得到平均分配。
for i in {0..10}; do echo -n "$((RANDOM*36/32768 + 10)) "; done; echo
bash腳本與用戶選擇的範圍:
#!/bin/bash
LOW=$1
HIGH=$2
echo $((RANDOM * ($HIGH-$LOW+1)/32768 + LOW))
你會希望做一些參數檢查也。
這使用外部工具而不是使用bash內置機制。因此,random.sh本身比一個工具變得更包裝。 – jehutyy