2行でまとめると
- bash で乱数が必要な場合はシェル変数 RANDOM を参照します
- 生成される乱数の値域は,0から32767,分布は一様分布,になります
以下詳細.
シェル変数 RANDOM
bash で乱数が必要な場合はシェル変数 RANDOM を参照します
echo $RANDOM
シェル変数 RANDOMは,値を参照するたびに新しい乱数を返します.たとえば以下のコードは,実行するたびに値がランダムに変わることが判ります
echo $RANDOM echo $RANDOM echo $RANDOM
乱数のseed(初期値)を設定するには, RANDOM変数に値を代入します.たとえば以下のコードは,毎回同じ乱数を表示します
RANDOM=123 echo $RANDOM echo $RANDOM echo $RANDOM
生成される乱数の値は,0 から32767,分布は一様分布になります.(man bash で表示されるマニュアルの, shell variable の RANDOMの項目に書いてあります)
生成された乱数の確認
念の為,乱数の性質を確認しておきます
まず bash で 10000個の乱数を生成,ファイルに保存しておきます
for x in `seq 10000`; do echo $RANDOM >> random.txt ; done
ファイル名は random.txt にしました
gnuplot を起動して
$ gnuplot
プロットします
> bin(x,width)=width*floor(x/width) > binwidth=100; plot 'random.txt ' using (bin($1,binwidth)):(1.0) smooth freq with boxes
これでヒストグラムが表示できます.分布としては,質の悪い一様分布,といったところです
乱数の利用例
ジョブの開始時刻をランダムにする
$RANDOM を 1000 で割ったあまりは 0 から 999 です.単位を秒と考えると,これは0秒から約16分に相当します
つまり
sleep $(($RANDOM % 1000))
これで,スクリプトをランダムに0秒から16分停止できるようになります
使い方としては,たとえば job.sh の起動タイミングをランダムに最大16分遅らせるなら(ランダムにウェイトを入れるなら)
sleep $(($RANDOM % 1000)) && job.sh
と書けば良いです