2017-04-21 60 views
2

如果我運行./random.sh 10 45,它只會返回1045之間的隨機數。生成符合Bash範圍的隨機數

我能夠生產使用

randomNumber=$((1 + RANDOM % 100)) 

,但現在我怎麼能允許用戶指定隨機數的上限和下限的隨機數?

回答

2

您可以使用shuf

#!/bin/bash 

# $1: Lower limit 
# $2: Upper limit 
# Todo Check arguments 

shuf -i $1-$2 -n 1 

./random.sh 45 50

+0

這使用外部工具而不是使用bash內置機制。因此,random.sh本身比一個工具變得更包裝。 – jehutyy

1

請嘗試以下(純BASH):

low=10 
    hgh=45 
    rand=$((low + RANDOM%(1+hgh-low))) 
0

的想法是設置範圍在下界默認,說10 ,有更高的界限,說45。所以你調整下限是這樣的:$RANDOM % 45 + 10,不是嗎?

但沒有與此解決的問題,它假定你將永遠是0 + 1045之間,其實它的工作原理,直到你達到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)如果你想讓你的索引包含更高的界限。

0

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)) 

你會希望做一些參數檢查也。