2013/05/03

シェルで乱数を扱う

私はシェル上で乱数をあまり使うことはないのですが、そもそもUNIX機を中心に使っていた時代には簡単に扱えませんでした。シェル上で乱数を扱うには実は2つの方法があります。1つはLinuxでbashを前提とした環境依存の方法です。もう1つの方法はシェルに依存しない方法です。

シェル変数RANDOM

まずはbash上でのみ利用できる方法です。前段にてLinuxという条件を記載しましたが、シェルスクリプトを実装する際は、/bin/shで動くことを前提に通常は実装すると思いますのでLinuxを前提という条件を加えています。ご存知の方も多いと思いますが、Linxuでは/bin/shはbashのシンボリックリンクになっている点に基づいています。
bashでは、シェル変数としてRANDOMが容易されています。このRANDOM変数には0~32767までの整数がランダムに格納されます。実行例は以下の通りです。

 $ echo $RANDOM
 31129
 foo=$RANDOM
 ech $foo
 25999
シェル変数を利用するだけなので、非常に簡単に乱数を扱えるのがお分かり頂けたかと思います。

乱数疑似デバイスファイル

続いてはシェルに依存しない方法を紹介します。
疑似デバイスファイル(/dev/nullなどのことです。)の中に/dev/randomがあります。これを利用して乱数を生成します。この疑似デバイスファイルを使って乱数を生成するには、odコマンドを利用します。od(Octal Dump)コマンドはファイルや標準入力のデータを 8進数・10進数・16進数で表示するコマンドです。デフォルトは 8進数ダンプでダンプを行います。実行例は以下の通りです。

 $ od -An -N4 -tu$ 
odコマンドのオプションをいくつか指定しています。まず桁数についてですが、「-N」オプションが入力のバイト数、「-t」が出力のバイト数をそれぞれ指定しています。これらオプションに続く数値は合わせておく必要があります。なお、-N4以上を指定しても残念ながら桁数をふやすことはできないので注意して下さい。また「-t」オプションに続く「u」はunsigned decimalです。
「-A」オプションは表示するオフセットの基数を指定するオプションです。dが10進数、oが8進数、xが16進数、nがオフセット非表示を表します。乱数を取得したいのでオフセットを表示する必要はないため「n」を指定しています。

0 件のコメント:

コメントを投稿