シェルスクリプトで乱数を扱う
シェル組込変数 RANDOM
bashやzshなど一部のシェルでは特殊な変数 RANDOM があり、参照する毎に範囲の小さい整数を得ることが出来ます。
$ echo $RANDOM 30940 $ echo $((RANDOM % 100)) 22
jot(1)
jot(1)は連番や乱数を出力するプログラムです。出力回数や範囲を指定出来るのでなかなか使い出はあります。deb系では athena-jot パッケージをインストールします。
$ jot -r 1 10 99 72 $ jot -r 10 1000 9999 8881 2834 3537 5889 7430 9962 4905 9548 3575 9762
awk
awkの関数 rand() で0–1の範囲の実数の乱数を扱えます。srand() で乱数の初期化することを忘れずに。
$ awk 'BEGIN{srand();print int(rand() * 100)}' 21
/dev/urandom
urandomデバイスを読むことで文字通りランダムなバイト列を得ることが出来ます。そのままでは扱えないのでodで出力を加工します。
これで得られる整数は範囲が2の冪乗になるので、必要なら剰余を取るなどしてさらに加工します。$(()) を使った数値計算はPOSIX標準で使えるのでexprよりはこれを使う事をおすすめします。
$ od -vAn -tu2 -N2 </dev/urandom 22541 $ echo $((`od -vAn -tu2 -N2 </dev/urandom` % 1000)) 104 $ od -vAn -tu4 -N16 </dev/urandom 495822970 28206112 1470428861 335315840 $ ( for val in `od -vAn -tu1 -N8 </dev/urandom` ; do echo $((val % 100)) ; done ) 48 0 75 37 55 24 87 50 $ od -vAn -tx1 -N16 </dev/urandom |tr -d '[:space:]' |sed -e 'a\' 722b6a021c13873512c5587b176e4b63 $ dd if=/dev/urandom bs=24 count=1 2>/dev/null |base64 SxaXbo5BP/El3MWMhaFD/42k0N1g00gc
rand(1ssl)
opensslでもランダムなバイト列を生成することが出来、/dev/urandom の代わりに使えます。
普通このコマンドは -base64 オプションと合わせてナンス生成等に使う事が多いと思います。
$ openssl rand 4 |od -vAn -tu4 3671196097 $ openssl rand -base64 24 TqJAtoQ6Xlho56DvnnEkuV29mqKz8mQb
shuf(1)
shufは入力された行をランダムに入れ替えて出力します。乱数とは少し毛色が違いますが一応。
$ shuf <<heredoc > aaa > bbb > ccc > ddd > eee > fff > heredoc fff eee ccc bbb aaa ddd