Bashシェルスクリプトでランダムな数値(乱数)を生成する
はじめに
意外にも、初歩的な「乱数」に関するエントリを書いたことがなかった( _過去にサラリと触れていぐらいた_ )ようなので、今回ネタにすることにしました。
「ランダム」というキーワードを取り上げたエントリも参考に紹介します。
- Bash シェルスクリプトでランダムな文字列を生成する
- Bash シェルスクリプトで 1〜100 までの数からランダムに 10 個を重複なしで取り出す方法
- シェルで shuf コマンドを使って入力情報をいろんな方法でシャッフルしてみる(組み合わせにも使える)
検証環境
乱数を取得するための組み込み変数「RANDOM」を使う
Bash には、乱数を取得するための組み込み変数として RANDOM というものが用意されています。
試しに $RANDOM
を出力してみましょう。
echo $RANDOM
を実行するたびに、出力される数値が異なります。
"RANDOM" 変数の最大値は?最小値は?
RANDOM 変数は参照するたびにランダムな値を返しますが、値の範囲はどうなっているでしょうか?
試しに $RANDOM
を 1,000,000 回 出力した結果を集計してみます。
このように、 "RANDOM" 変数は 0 〜 32767 の間でランダムな数値を返却します 。
( 2 の 15 乗分の数値がランダムに算出されます。 )
任意の範囲の乱数を求める方法( ex: 0〜5 )
任意の範囲の乱数を求めたい場合にはどうしたらよいでしょう?
例えば、 サイコロの出目として 6 つの数値( 0〜5 )をランダムに取得したい場合 はどうしたら良いでしょう?
この場合も RANDOM
変数を利用することができます。
10,000 回 出力した結果を集計してみます。
コインの出目を求めたい場合には 2 で割ったあまり を算出します。
【2022-10-16 追記】6 つの数値(0〜5)をランダムに取得する際の注意
Twitter にてアドバイスを頂きました!
この方法だと、ごく僅かではありますが偏りが発生します ( 0 と 1 だけ、他の出目より 1/32767 だけ多くでる )。
これは RANDOM
変数が 0 〜 32767 ( 20-1 〜 215-1 )の間でランダムな数値を返却するためです。
RANDOM
変数の値を 3 つ加算 ( 0 〜 98303 ) し、範囲内に登場する数値の数が 6 で割り切れるようにすることでこの問題を解消できます。
"32767" 以上の乱数を算出したい場合は?
"32767" 以上の乱数を求めたい場合にはどうしたら良いでしょう?
RANDOM
変数を複数回加算する
Twitter にてアドバイスを頂きました!
RANDOM
変数を複数回足し合わせることで 32767 の上限を引き上げることができます。
RANDOM + RANDOM
で 0 〜 65535 、 RANDOM + RANDOM + RANDOM
で 0 〜 98303 のランダム値を求めることができます。
shuf
コマンドを使う
shuf
コマンドを使って 「1 から 100,000」 までの乱数を算出してみます。
shuf
コマンドがない場合は?
shuf
コマンドがない場合は、以下のように seq
、 sort
、 head
を組み合わせて頑張りましょう。
ただ、複数コマンドを組み合わせていることもあり、 遅い です。
ひとこと
使えるなら RANDOM
で実現するのがよいでしょう。
ディスカッション
コメント一覧
まだ、コメントがありません