PHPで乱数作成に使われるのはrand関数またはmt_rand関数の2つ
ここではこの2つを使って乱数を作成する方法を解説します。
また乱数生成で役立つテクニックについてもコード例と一緒に紹介
乱数生成に使える2つの関数
冒頭で書いたように乱数生成に使える関数は次の2つ
- rand関数
- mt_rand関数
この2つは使い方は全く同じです。
しかし処理速度が違うので基本的には mt_rand を使います。
その使い方やコード例については次の通り
rand関数
こちらはPHP標準の乱数関数
もしPHPバージョン7.1.0未満ならこちらは使用しない方がいいです。
なぜなら偏りがあったり処理が低速で実用には向いていないから
なので7.1.0未満の場合は次で紹介する mt_rand を使う方が実用的な乱数が得られます、
使い方は最小値を $min 、最大値を $max として次のような感じ
1 |
$rand = rand( $min, $max ); |
最小値から最大値までの間のランダムな整数値 $rand が返ってきます。
ちなみに他の言語のように初めにシード値を設定しておく必要はありません。
シード値を設定する関数もありますが、自動で呼ばれるので二度手間です。
以下は 1 ~ 10 までの乱数を生成しているコード例
1 2 |
/** 1 ~ 10 までの乱数を発生 */ $rand = rand(1, 10); |
両端の値 1 と 10 はどちらも乱数に含まれることに注意
以上がrand関数の基本的な使い方
JavaScriptの乱数とか違って範囲が関数側で決められるのが便利です。
mt_rand関数
こちらはメルセンヌ・ツイスター乱数生成器を使って乱数を発生させる関数
従来のrand関数だと変に偏りがあったり、処理が低速だったりしました。
その問題点をすべて解決して4倍以上高速化した関数がこの mt_rand です。
ちなみにPHP7.1.0では rand は mt_rand のエイリアス(関数の別名)になりました。
なのでPHPバージョン7.1.0以降ならrand関数を使っても問題ありません。
そして使い方はrand関数と "全く" 同じです。
例えば次は 1 ~ 10 までの乱数を発生させているコード例
1 2 |
/** 1 ~ 10 までの乱数を発生 */ $rand = mt_rand(1, 10); |
先ほどのコード例の rand をただ mt_rand に置き換えただけです。
以上がmt_rand関数の使い方
PHP7.1.0未満を使っているならこちらの方を使った方がいいですね。
乱数作成に役立つテクニック
次は乱数作成で役に立つかもしれないテクニックを紹介します。
もしただの乱数ではなく
- 小数を含む乱数を作りたい
- 重複なしの乱数列を作りたい
- 再現性のある乱数を作りたい
などの場合に役立つテクニックです。
小数を含む乱数を作る
rand関数またはmt_rand関数が返す乱数は全て整数です。
なので小数を含む乱数を作るには少し工夫が必要
そのやり方は次で詳しくまとめました。
もし整数以外の乱数が必要ならお試しあれ
重複なしの乱数を作る
例えば 1 ~ 10 までの間で次のような重複しない乱数を作りたいとします。
1 |
7 5 8 1 3 4 6 10 9 2 |
このような乱数を作る場合も少し工夫が必要になります。
そのやり方とコード例については次の記事でまとめた通り
本当に少しの工夫で重複なしの乱数が作れます。
再現性のある乱数を作る
例えばある条件で全く同じ乱数列がほしい場合
そういう時はsrand関数またはmt_srand関数でシード値を初めに設定すればOKです。
もしPHP7.1.0未満を使っているなら mt_rand と同じく mt_srand を使ってください。
以下シード値を設定して再現性のある乱数を10個発生させるコード例
1 2 3 4 5 |
mt_srand(42); for($i = 0; $i < 20; $i++){ print_r(mt_rand(1, 10) . ' '); } |
PHPバージョンにもよりますが、毎回次の乱数列が表示されます。
1 |
3 8 7 5 7 6 1 5 1 4 9 5 1 5 2 3 6 6 8 7 |
ちなみに上の乱数列はPHP7.2.5での表示
他のバージョンだと変わるかもしれません。
このようにシード値を使えば規則性のある乱数列も作れます。
なにか前の状態を保存しておいて後で再現したい時とかに役立つかも
ここまでのまとめ
ということでPHPでの乱数についてもう一度まとめ
- rand関数かmt_rand関数を使う
どちらも使い方は同だが、速度や周期などの性能は mt_rand の方が上
- 通常はシード値の設定は必要なし
自動的に行われるので普通に乱数を作成するだけならシード値は設定しておく必要なし
- PHP7.1.0未満ならmt_rand関数
もしバージョンが7.1.0未満なら2つの関数は別物なので mt_rand を使う必要あり
- PHP7.1.0以降ならrand関数
このバージョン以降 rand は mt_rand のエイリアスなのでどっちを使ってもOK
以上PHPでの乱数の使い方と役立つテクニックに次いででした。