例えば1~10までの間で重複なしで乱数を作りたいなどの場合、普通に乱数を発生させるのでは同じ数が被ってしまいますよね。
なので被らない乱数にするには少しだけ工夫が必要です。
ここではそういう一切重複しない乱数を作るのに一番簡単な方法をまとめました。
とりあえず重複させない方法を考えてみる
まずJavaScriptで乱数を発生させるには Math.random を使います。
これは0以上1未満の間で乱数を発生させるメソッド
詳しい使い方や応用例については次の記事でまとめた通りです。
このメソッドでどうすれば重複なしの整数乱数が作れるか考えてみます。
まず最初に工夫が必要なのが乱数を整数値に絞り込むということ
少数が含まれてしまうと困るので乱数を作る式で小数を除外しないといけません。
なので乱数の最小値を mix 、最大値を max とすると次の式が必要
1 |
Math.floor(Math.random() * (max - min)) + min |
これで min 以上 max 未満の整数値のみの乱数が返ってきます。
詳しいやり方については整数値のみの乱数を作る方法と注意点でもまとめました。
そして重複なしの乱数を作る上で一番大事なことは
乱数を生成するときに被っていないかのチェックが必要
ということ
つまり同じ乱数を二度以上作らないようにしないといけません。
この方法はいろいろあると思いますが、一番簡単なのは配列を使うことです。
次のように乱数生成と同時に配列で重複チェックするのが一番簡単
- とりあえず一時的に範囲内の乱数を生成
- 配列にそれが含まれているか確認
- もし含まれていなければ配列に追加
- もし含まれていれば処理をスキップ
- この流れを作りたい乱数の数だけ繰り返す
大まかに書くとこんな流れです。
これだけだと分かりにくいので具体的なコード例を使って説明します。
重複なし乱数の作り方とコード例
ここでは1~10までの整数の間で重複なしの乱数を作りたいと思います。
その作り方とコード例は次の通り
まず重複チェックに使う配列 randoms を用意
1 |
var randoms = []; |
そして最小値と最大値を定義する変数も用意
1 |
var min = 1, max = 10; |
ここでは乱数の最小値を min 、最大値を max とします。
そして次に整数値のみを返す関数を次のように作成
1 2 3 |
function intRandom(min, max){ return Math.floor( Math.random() * (max - min + 1)) + min; } |
整数のみの乱数を作る方法と注意点でも書いたように整数の場合は右端の値に注意です。
上のコードでは右端の値つまり max が含まれるように +1 しています。
そうしたら後はループ内で重複チェックしながら乱数を作成していくだけです。
1 2 3 4 5 6 7 8 9 |
for(i = min; i <= max; i++){ while(true){ var tmp = intRandom(min, max); if(!randoms.includes(tmp)){ randoms.push(tmp); break; } } } |
まず min から max の間でforループ
そして内側のwhileループなかで一時的な乱数 tmp を生成
もしそれが配列
randoms に含まれていれば追加して
break 、
もし含まれていないならwhileループを続行
こんな感じで重複なしの乱数を作成しています。
ちなみに全体のコードを載せると次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** 重複チェック用配列 */ var randoms = []; /** 最小値と最大値 */ var min = 1, max = 10; /** 重複チェックしながら乱数作成 */ for(i = min; i <= max; i++){ while(true){ var tmp = intRandom(min, max); if(!randoms.includes(tmp)){ randoms.push(tmp); break; } } } /** min以上max以下の整数値の乱数を返す */ function intRandom(min, max){ return Math.floor( Math.random() * (max - min + 1)) + min; } |
実際にこのコードを5回試してみました。
そして各回でコンソールに表示された乱数配列の内容は次の通り
1 |
[ 8, 1, 10, 4, 6, 7, 9, 3, 2, 5 ] |
1 |
[ 3, 10, 6, 9, 5, 7, 8, 2, 1, 4 ] |
1 |
[ 10, 4, 3, 6, 7, 2, 5, 1, 9, 8 ] |
1 |
[ 5, 7, 3, 2, 9, 4, 6, 8, 10, 1 ] |
1 |
[ 1, 8, 7, 2, 5, 10, 9, 3, 4, 6 ] |
重複なしで1~10までの整数がランダムに出現しています。
以上がJavaScriptで重複なしの乱数を作るテクニック
難しいことをしなくても少しの工夫をすれば簡単に作れます。
ここまでのまとめ
ということでJavaScriptで重複なしの乱数を作成する方法についてでした。
配列の要素をランダムだけどそれぞれ一度だけ取り出したいときなどに便利かもしれません。