bashでRANDOMの上限値32767を超える乱数を生成する

bash で乱数値を取得するには、組み込み変数の RANDOM を使えば良い。
ただし、RANDOM で取得可能な乱数は 0 から 32767 まで。 32767 を超える乱数を取得するには、工夫が必要。

RANDOM を複数回使用する

例えば、0 から 10万までの乱数値を取得するには、以下のように RANDOM を2回使用する。

1$ echo $(( $((RANDOM % 10000))$((RANDOM % 100)) % 100001 ))
272230

この式を分解して説明すると次のようになる。

  1. $((RANDOM % 10000)) で 0 から 9999 までの乱数を取得
  2. $((RANDOM % 100)) で 0 から 99 までの乱数を取得
  3. 上記 1, 2 の二つを結合することで 0 から 999999 までの乱数を取得できる
  4. 上記 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

関連ページ