はじめに
意外にも、初歩的な「乱数」に関するエントリを書いたことがなかった( 過去にサラリと触れていぐらいた )ようなので、今回ネタにすることにしました。
「ランダム」というキーワードを取り上げたエントリも参考に紹介します。
- 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 で実現するのがよいでしょう。