例えば1~10までで重複なしで10個の数を作りたい
こういう場合、ただ乱数を使うだけだと数が重複してしまいますよね。
ですが完全に重複しない乱数を作るのは以外と難しくありません。
ここではPHPでそのような重複なしの乱数を作る方法について紹介します。
重複しない乱数を作る方法を考えてみる
まずPHPで乱数を作る場合、次でまとめたようにrand関数またはmt_rand関数を使います。
どちらの関数もある範囲内のランダムな整数を返す関数です。
例えば 2 ~ 5 までの乱数を発生させるなら次のようなコード
1 2 |
/** 2 ~ 5 までの乱数を発生 */ $rand = mt_rand( 2, 5 ); |
この関数を使って重複なしの整数を作りたいわけです。
例えば 1 ~ 10までで重複なしの整数を作るならこんな感じ
1 |
7 5 8 1 3 4 6 10 9 2 |
こういう風に同じ数が二度以上出てきてはいけません。
では具体的にどうすればいいか考えてみると一番簡単なのは配列を使うことですね。
つまり次のような手順で重複チェックしながら乱数列を作るということ
- ある範囲内で1つ乱数を作る
- 配列にその乱数が含まれてないか調べる
- 含まれてないなら配列の最後に追加
- 以下同じことの繰り返し・・・
こんな感じでやれば確実に重複なしの乱数列が作れます。
では次で具体的なコード例について紹介しましょう。
重複なしの乱数を作るコード例
ここでは 1~10までの間で重複なしの乱数を作りたいと思います。
その手順とコード例は次の通り
まず次のように乱数を入れる配列 $rands を宣言
1 2 |
/** 乱数用配列 */ $rands = []; |
そしてここでは $min を最小値、 $max を最大値を表す変数として使います。
1 2 |
/** 乱数の範囲は1~10 */ $min = 1; $max = 10; |
そうしたら後はループ内で乱数の重複チェックをしていくだけ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
for( $i = $min; $i <= $max; $i++ ){ while( true ){ /** 一時的な乱数を作成 */ $tmp = mt_rand( $min, $max ); /* * 乱数配列に含まれているならwhile続行、 * 含まれてないなら配列に代入してbreak */ if( ! in_array( $tmp, $rands ) ){ array_push( $rands, $tmp ); break; } } } |
まず $min から $max までの間でとりあえずループ
そしてwhileループ内でコメントに書いた通りに重複チェックしています。
ちなみに全体のコードを載せると次の通り
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/** 乱数用配列 */ $rands = []; /** 乱数の範囲は1~10 */ $min = 1; $max = 10; for($i = $min; $i <= $max; $i++){ while(true){ /** 一時的な乱数を作成 */ $tmp = mt_rand($min, $max); /* * 乱数配列に含まれているならwhile続行、 * 含まれてないなら配列に代入してbreak */ if( ! in_array( $tmp, $rands ) ){ array_push( $rands, $tmp ); break; } } } |
これで完全に重複しない乱数列が作れるようになります。
もし乱数の範囲を変えたいなら $min と $max の値を変えればいいだけです。
ちなみにこのコードを使って何回か乱数列を作成すると次の結果になりました。
1 |
3 6 2 1 10 7 4 9 5 8 |
1 |
8 3 5 2 10 9 1 6 7 4 |
1 |
7 5 10 8 1 4 2 9 3 6 |
1 |
2 6 3 7 9 10 5 4 8 1 |
1 |
4 7 1 10 5 8 2 3 6 9 |
どの乱数列も1~10までが被ることなく並んでいます。
ここまでのまとめ
以上PHPで重複なしの乱数を作る方法についてでした。
重複チェックと同時に乱数列も手に入るので、まあまあ効率はいいかなと思います。
もっと効率のいい方法もあるかもしれませんが、ここではこの方法を紹介しました。