bash で乱数を使う

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 を起動して

$ gnuplot

プロットします

> bin(x,width)=width*floor(x/width)
> binwidth=100;  plot 'random.txt ' using (bin($1,binwidth)):(1.0) smooth freq with boxes

これでヒストグラムが表示できます.分布としては,質の悪い一様分布,といったところです

f:id:pyopyopyo:20200906140054p:plain
bashの乱数

乱数の利用例

ジョブの開始時刻をランダムにする

$RANDOM を 1000 で割ったあまりは 0 から 999 です.単位を秒と考えると,これは0秒から約16分に相当します

つまり

sleep $(($RANDOM % 1000)) 

これで,スクリプトをランダムに0秒から16分停止できるようになります

使い方としては,たとえば job.sh の起動タイミングをランダムに最大16分遅らせるなら(ランダムにウェイトを入れるなら)

sleep $(($RANDOM % 1000)) && job.sh

と書けば良いです