2017年6月15日 星期四

Bash產生亂數

很多時候都會需要用到亂數,在Linux下面可以用下面的指令得到亂數
echo $RANDOM
echo $((1+RANDOM%10))
echo $((78+RANDOM%10))
while true; do echo $RANDOM; sleep 0.5; done
watch -n 1 '(echo $RANDOM )'
在這邊$RANDOM這個變數的值會介於 0到32767 的整數,所以上述的指令意思會是:
  1. 產生一個介於0-32767的亂數
  2. 產生一個介於1到10之間的亂數
  3. 產生一個介於78到87之間的亂數
  4. 不斷在螢幕上面跳出介於0-32767的亂數

上面這個方法得到的叫做pseudorandom integer,意思就是不是真的夠亂的亂數
一般使用沒有問題,但是如果是要用在加密上面,需要比較亂的亂數。那可以使用曹子德 (Theodore Y. Ts'o) 開始發展的 /dev/random與/dev/urandom。一般用法如下:
dd if=/dev/urandom count=4 bs=1 | od -t d
od -A n -t d -N 1 /dev/urandom | tr -d ' '
od -A n -t d -N 2 /dev/urandom | tr -d ' '
echo $(( $(od -A n -t d -N 2 /dev/urandom | tr -d ' ')%100 ))
watch -n 1 "(od -A n -t d -N 3 /dev/urandom | tr -d ' ')"
while true; do echo $(od -A n -t d -N 2 /dev/urandom | tr -d ' '); sleep 0.5; done

上面的指令od,是一種檔案內容篩選器,把內容根據某些方式顯示出來
  • -A base:Specify the input address base.  base may be one of d, o, x or n, which specify decimal, octal, hexadecimal addresses or no address, respectively.
  • -t type:輸出的格式。這邊的 d 代表的是signed decimal,如果用 u 就是 unsigned decimal。
  • -N length:Dump at most length bytes of input.

以上的指令參考《How to generate random number in Bash?》一文
_EOF_

沒有留言:

張貼留言