介紹如何在 bash 指令稿中產生隨機的亂數資料。
產生隨機亂數
bash 中的 $RANDOM
是一個特殊的變數,每當這個變數被讀取時,就會自動產生一個隨機的亂數,而數值的範圍介於 0
與 32767
之間:
# 產生介於 0 到 32767 的亂數 echo $RANDOM
13342
限制亂數範圍
如果想要限制亂數的數值範圍,可將 $RANDOM
所產生的亂數加上一些簡單的數學運算,就可以自由調整數值的範圍,例如產生介於 0
到 9
的亂數:
# 產生介於 0 到 9 的亂數 echo $(( $RANDOM % 10 ))
2
產生介於 1
到 10
的亂數:
# 產生介於 1 到 10 的亂數 echo $(( $RANDOM % 10 + 1 ))
9
指定亂數種子
$RANDOM
所產生的亂數每次都不同,如果在程式的開發與除錯時,需要固定產生的亂數,可以在產生亂數之前,先設定亂數種子,這樣就可以確保每次執行都會產生相同的亂數序列,方便驗證程式的正確性:
# 指定亂數種子 RANDOM=123 # 產生亂數 echo $RANDOM
2877
亂數設備檔 /dev/urandom
除了使用 bash 內建的 $RANDOM
之外,我們也可以使用 Linux 系統上所提供的亂數設備檔 /dev/urandom
來產生亂數,這個設備檔會提供二進位的亂數資料,需要搭配 od
來產生亂數:
# 2 位元組,無號整數 od -vAn -N2 -tu2 < /dev/urandom
23514
# 1 位元組,有號整數 od -vAn -N1 -td1 < /dev/urandom
-125
# 4 位元組,有號整數 od -vAn -N4 -tu4 < /dev/urandom
2675093016
自動指定亂數種子
如果希望更改 $RANDOM
預設的亂數種子,以下是兩種自動指定亂數種子的方式。
一種是從 /dev/urandom
取得亂數,然後作為亂數種子:
# 從 /dev/urandom 取得亂數 SEED=$(od -vAn -N2 -tu2 < /dev/urandom) # 指定亂數種子 RANDOM=$SEED # 產生亂數 echo $RANDOM
另外一種是以目前指令稿的行程 ID(process id)作為亂數種子:
# 以行程 ID 來指定亂數種子 RANDOM=$$ # 產生亂數 echo $RANDOM
參考資料:TLDP