日常生活中,會經常用到隨機數,使用場景非常廣泛,例如買彩票、丟骰子、抽簽、年會抽獎等。
Shell 下如何生成隨機數呢,米撲博客特意寫了本文,總結 Linux Shell 產生隨機數的多種方法。
計算機產生的的只是“偽隨機數”,不會產生絕對的隨機數(是一種理想隨機數)。實際上,偽隨機數和理想隨機數也是相對的概念,例如偽隨機數在1萬萬億億億年內也無法重復,算是理想隨機數么?
偽隨機數在大量重現時也并不一定保持唯一,但一個好的偽隨機產生算法將可以產生一個非常長的不重復的序列,例如 UUID(通用唯一識別碼)在100億年內才可用完。
1. 使用系統的 $RANDOM 變量(CentOS、Ubuntu、MacOS 都支持,但只有5位數隨機)
mimvp@ubuntu:~$ echo $RANDOM17617
$RANDOM 的范圍是 [0, 32767]
示例:使用 for 循環來驗證:
#!/bin/bash# mimvp.com 2016.05.10function print_random() {  for i in {1..10};  do    echo -e "$i /t $RANDOM"  done}print_random運行結果:
# sh mimvp_shell_rand.sh
1 20191
2 16817
3 25971
4 1489
5 34
6 25183
7 920
8 315
9 18845
10 29519
如需要生成超過32767的隨機數,可以用以下方法實現(有缺陷)
例:生成 40,000,000~50,000,000 的隨機數,但最后末尾五位數在隨機變化,實現原理有缺陷
#!/bin/bash# mimvp.com 2016.05.10## Linux 系統隨機數 + 范圍上限值后, 再取余function mimvp_random_bignum() {  min=$1  max=$2  mid=$(($max-$min+1))  num=$(($RANDOM+$max))    # 隨機數+范圍上限, 然后取余  randnum=$(($num%$mid+$min)) # 隨機數包含上下限邊界數值  echo $randnum}function print_random_bignum() {  for i in {1..10};  do    bignum=$(mimvp_random_bignum 40000000 50000000)    echo -e "$i /t $bignum"  done}print_random_bignum運行結果:
# sh mimvp_shell_rand.sh
1 40022422
2 40014261
3 40022712
4 40016695
5 40026575
6 40032198
7 40026667
8 40016024
新聞熱點
疑難解答