Javascriptで乱数を生成する

JavaScript

Javascriptで乱数を生成していろいろ使ってみます。

手始めにMath.random()を用いて標準で取得できる乱数を見てみます。

for (let i = 0; i < 10; i++) {

    const randomNumber = Math.random(); //乱数を生成
    
    console.log(randomNumber); //生成した乱数を表示

}

実行してみた結果がこちら。当然ランダムなので実行するたびに値は変化します。

0.29808638454273084
0.7479640542873984
0.8096050305608606
0.27916124058526925
0.790859491682302
0.749158525276046
0.5293487246349424
0.9840457158312006
0.12618915557117427
0.7117649827010994

ですが結果を見ていただければわかるようにMath.random()は0と1の間の値を返すようです。(正確には0≤Math.random()<1となります。)

確率でtrueを返す条件式

これを利用すれば、確率でtrueとなる条件式が作れますね。

let count = 0;

for (let j = 0; j < 10**8; j++) {
    
    const randomNumber = Math.random(); //乱数を生成
    
    if (randomNumber < 1/7) count++; //生成した乱数を表示
    
}

console.log(count)

とりあえず、1/7の確率でtrueを返すには上記のようにすればいいでしょう。1億回ループを回して何回trueになったか数えました。結果は、、、

14285221

理論的には14,285,714.286回なのでちゃんと1/7になっていることがわかります。

特定の範囲での乱数を生成する

乱数を使う時に0以上1未満の小数のままでは扱うのに困る場合があると思います。例えばビンゴ。ビンゴカードに0.5293487246349424などとは書いていません。0以上75以下の整数で取得したいですよね。そういう場合は以下のように書きます。

let countList = new Array(75).fill(0); //各数字の出現回数を記録する配列


for (let j = 0; j < 10000; j++) {
    
    const randomNumber = Math.random(); //乱数を生成
    
    bingoNumber = Math.floor(randomNumber * 75) + 1; //1から75の乱数を生成
    
    console.log(bingoNumber);
    
    countList[bingoNumber-1] += 1;
    
}

console.log(countList)

例えばA以上B以下の乱数を生成したい場合はMath.floor(Math.random() * (B-A+1) ) + Aとすることで生成できます。ビンゴの場合はA=1,B=75なので(B-A+1)=75-1+1=75となり、上のコードのようになります。Math.floorは引数に数値をとり、それを小数点以下切り捨てて返します。

そのため、Math.floor(Math.random() * (B-A+1) )とすることで0以上B-A+1未満の乱整数、すなわち0以上B-A以下の乱整数が取得できます。その後Aを加算することでA以上B以下の乱整数を取得しているのです。

乱数を用いてランダムに文字を表示する

これを用いてランダムに麻雀牌を表示するプログラムを書いてみましょう。

for (let j = 0; j < 100; j++) {
    
    const randomNumber = Math.random(); //0から1の乱数を生成
    
    mahjongNumber = Math.floor(randomNumber * 44) + 126976; //特定の範囲で乱数を生成
    
    console.log(String.fromCodePoint(mahjongNumber)); //数字を文字に変換し出力する

}

結果は、、

🀝🀁🀎🀎🀆🀝🀍🀛🀥🀤🀇🀣🀓🀓🀚🀪🀒🀞🀟🀑🀜🀕🀧🀨🀑🀅🀚🀚🀫🀡🀚🀦🀧🀦🀢🀎🀚🀂🀚🀙🀕🀓🀞🀠🀗🀓🀤🀆🀑🀇🀞🀝🀣🀚🀔🀚🀨🀝🀖🀪🀣🀚🀈🀎🀎🀀🀁🀎🀔🀂🀣🀧🀊🀫🀀🀪🀛🀟🀩🀒🀥🀆🀊🀓🀆🀗🀁🀫🀣🀃🀫🀗🀂🀃🀟🀑🀥🀏🀣🀧

いいですね。(改行は削除しています。)麻雀牌がズラズラと並んでいて素敵です。

配列からランダムな要素を取り出す

let mahjongList = new Array(44).fill().map((_,i)=>String.fromCodePoint(126976+i));

console.log(mahjongList)

for (let j = 0; j < 100; j++) {
    
    const randomNumber = Math.random(); //乱数を生成
    
    mahjongNumber = Math.floor(randomNumber * mahjongList.length); //1から75の乱数を生成
    
    console.log(mahjongList[mahjongNumber]);

}

結果はこうなりました。

["🀀", "🀁", "🀂", "🀃", "🀄", "🀅", "🀆", "🀇", "🀈", "🀉", "🀊", "🀋", "🀌", "🀍", "🀎", "🀏", "🀐", "🀑", "🀒", "🀓", "🀔", "🀕", "🀖", "🀗", "🀘", "🀙", "🀚", "🀛", "🀜", "🀝", "🀞", "🀟", "🀠", "🀡", "🀢", "🀣", "🀤", "🀥", "🀦", "🀧", "🀨", "🀩", "🀪", "🀫"]
🀫🀌🀂🀧🀊🀎🀒🀔🀤🀫🀧🀔🀤🀜🀑🀅🀡🀠🀀🀅🀤🀞🀁🀞🀔🀅🀟🀞🀫🀕🀣🀦🀂🀀🀃🀌🀝🀉🀡🀏🀋🀦🀊🀃🀪🀩🀌🀞🀒🀇🀕🀜🀅🀁🀍🀋🀂🀥🀛🀏🀨🀝🀫🀑🀖🀉🀨🀚🀎🀆🀤🀙🀖🀊🀩🀅🀙🀉🀩🀎🀩🀨🀂🀅🀘🀇🀅🀟🀏🀈🀇🀣🀓🀇🀀🀓🀪🀩🀨🀨

配列の要素をランダムに取得する際は少しコードが簡単になります。なぜならば配列にアクセスするためのインデックスは0から(要素数-1)までであるためです。

麻雀牌をランダムに表示したい場合、都度乱数から文字を取得するのか、もしくは配列に格納した後そこからランダムに取り出すのか。書き手の性格が出そうですね。しらんけど。

おまけ 配列からランダムな要素を返す関数

const getRandomElementFromArray = (arr) => {
    return arr[Math.floor(Math.random()*arr.length)]
}

書くとしたらこうでしょうかね。