2017-07-16 35 views
0

使用shell腳本,我希望生成五個文件,並且我希望在每個文件中放置從50000到150000的不同隨機數範圍。我試過類似以下的東西,如何在shell腳本中使用隨機數字?

for i in 01 02 03 04 05; do 
A=$((50000+100000)) 
B=$(($B%$A)) 
cat > ${i}.dat << EOF 
AArandom=$A 
EOF 
done 

但是這不起作用....我怎樣才能使隨機數字和打印出每個文件?

+0

@Steve沒有重複,因爲範圍要求:'$ RANDOM'產生號碼'0的範圍內 - 32767',但在這裏,一個更大的範圍需要。 – janos

+0

如果你想在bash中做些什麼,「man bash」往往是一個很好的開始。手冊頁很長;搜索關鍵字,就像'隨機'... –

+0

我認爲這個問題應該重寫,以明確注意範圍> 32767的要求。 –

回答

5

每次讀取變量$RANDOM的值時, 它給你 是0和32767這樣不給你足夠的範圍在0和2^15 - 1之間的隨機數。 您可以使用兩個$RANDOM作爲基數15的兩位數字, ,然後採用適當的模數並應用適當的範圍歸一化。

這裏是包裹在一個函數的邏輯:

randrange() { 
    min=$1 
    max=$2 

    ((range = max - min)) 

    ((maxrand = 2**30)) 
    ((limit = maxrand - maxrand % range)) 

    while true; do 
     ((r = RANDOM * 2**15 + RANDOM)) 
     ((r < limit)) && break 
    done 

    ((num = min + r % range)) 
    echo $num 
} 

然後你就可以在這樣的循環生成文件:

for i in 01 02 03 04 05; do 
    echo "AArandom=$(randrange 50000 150000)" > $i.dat 
done 

注意存在的randrange執行情況的警告: 如果數值有偏差,有一個重新滾動的循環,但理論上這可能會阻止函數終止。 實際上,這是不太可能的,但值得一提。

+0

擴大範圍的好解決方案。結果是有偏見的,所以如果你想要一個完全一致的分佈,你會想要使用不同的結構。爲了明白爲什麼,考慮一個比randrange(2^15-1)* 2^15 +(2^15-1)可以處理的最高數小1的範圍。使用該範圍時,只有兩個「RANDOM」數字組合導致每個輸出數大於1,而*兩個*組合導致1(一個隨機數等於0,另一個等於0,另一個數等於2^15- 1),其結果是其他數字的兩倍。 – l0b0

+0

@ l0b0很好的電話,謝謝。我認爲我已經糾正了這個問題,並提供了一個「次要」警告,即如果你的運氣真的很糟糕,程序可能永遠不會終止) – janos

1

shuf可能是你想要什麼:

$ shuf -i 50000-150000 -n 1 
148495 
+0

不錯,簡單而且統一,因爲沒有汗水;-) – janos

+0

謝謝你,但還有一個問題。我如何使用cat命令在bash腳本中使用shuf命令? – exsonic01