[シェルスクリプト]ランダムな数値

2015年7月21日火曜日

linux シェルスクリプト

シェルスクリプトでランダムな数値を得る必要があったのでちょっと調べてみました。

bashならRANDOM変数が使える。
例えば0から9の整数をランダムに得たければ、以下のようにする。

$ echo $(($RANDOM % 10))

$RANDOMは0から32767までの整数を返すから、お手軽にやりたければこれでもいい。
だけど、bash以外のシェルを使う場合や、乱数を複数得たい場合は/dev/urandomを使うほうがよさそう。
試しに以下を実行すると画面にバイナリのデータが延々と表示される。

$ cat /dev/urandom

Linuxの/dev/urandomを読み込むと擬似乱数ビット列が生成されるため、このような表示になる。
これを数字文字列に変えるにはodコマンドを使う。

$ od -vAn --width=4 -tu4 </dev/urandom

-vAnは出力表示のオプション。
-vを指定しないと直前の行と同じデータはアスタリスクで出力されてしまう。
-Anは入力データのオフセットの表示を抑止する。

--width=4も出力表示のオプションだけど、1行が何バイトかを指定する。
※なぜか短縮形式の-wは推奨されないと書いてある。
http://linuxjm.osdn.jp/html/gnumaniak/man1/od.1.html

-tu4は出力フォーマットを指定している。この場合は符号なし4バイト整数を指定している。

ただし、このままでは延々と数字が表示され続けるので、-Nオプションで何バイトで終了するかを指定する。

$ od -vAn --width=4 -tu4 -N40 </dev/urandom

この場合4x10で10行出力された時点で終了する。
もちろん1行だけ必要な場合は-N4とする。

$ od -vAn --width=4 -tu4 -N4 </dev/urandom

これを0から9等に制限したければ、以下のようにawkで処理すればいい。

$ od -vAn --width=4 -tu4 -N4 </dev/urandom | awk '{ print $1 % 10 }'

参考Webサイト
シェルやシェルスクリプトで乱数を使う2つの方法