bashでRANDOMの上限値32767を超える乱数を生成する
bash で乱数値を取得するには、組み込み変数の RANDOM を使えば良い。
ただし、RANDOM で取得可能な乱数は 0 から 32767 まで。 32767 を超える乱数を取得するには、工夫が必要。
RANDOM を複数回使用する
例えば、0 から 10万までの乱数値を取得するには、以下のように RANDOM を2回使用する。
1$ echo $(( $((RANDOM % 10000))$((RANDOM % 100)) % 100001 ))
272230
この式を分解して説明すると次のようになる。
- $((RANDOM % 10000)) で 0 から 9999 までの乱数を取得
- $((RANDOM % 100)) で 0 から 99 までの乱数を取得
- 上記 1, 2 の二つを結合することで 0 から 999999 までの乱数を取得できる
- 上記 3 の乱数を 100001 で割った余りは、0 から 100000 の範囲内の乱数となる
もっと桁数が大きい乱数を取得したければ、RANDOM の使用回数を増やすことで対応可能。
awk を使う
RANDOM を繋げて使用すると、その意図がわかりにくくなりそうだ。
以下のようにbashにこだわらずに awk を使うのが良いかもしれない。
1$ awk 'BEGIN{srand(); print int(rand() * 1000000) % 100001}'
260765
指定範囲の乱数を取得する
これまでの内容を少し応用すれば、任意の指定範囲の乱数を取得できる。
例えば 30万から40万までの範囲内の乱数を取得したければ、以下のようにすれば良い。
1$ # RANDOM を使う場合
2$ echo $(($((RANDOM % 10000))$((RANDOM % 100)) % 100001 + 300000))
3327352
4$ # awk を使う場合
5$ awk 'BEGIN{srand(); print int(rand()*1000000) % 100001 + 300000}'
6323348