シェルスクリプトで乱数を扱う

シェル組込変数 RANDOM

bashzshなど一部のシェルでは特殊な変数 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