PHPではrand関数またはmt_rand関数を使えば簡単に乱数が作成できます。
ただ1つ問題点があるとすると整数の範囲内でしか作成できないこと
場合によっては少数の乱数を扱いたくなることもあるはずです。
ということでPHPで小数を含む乱数を作成する方法について解説します。
rand関数は整数乱数しか作れない
PHPでは次でまとめたようにrand関数またはmt_rand関数で乱数を作ります。
上で書いたようにどちらの関数もある範囲内で乱数を作る関数です。
ただ返される乱数は最小値から最大値までの整数だという点が不便なところ
例えば次は5~10までの乱数を10回発生させて表示させるコード例です。
1 2 3 4 |
for($i = 0; $i < 10; $i++){ print_r(mt_rand(1, 9)); if($i !== 9) print_r(', '); } |
このコード例の表示結果は次の通り
1 |
1, 5, 3, 6, 4, 9, 4, 4, 7, 1 |
見ての通りすべて整数です。
なので少数で乱数を得たいときは少し工夫が必要になります。
といっても乱数に少しだけ計算をするだけなのであまり難しくはありません。
少数を含む乱数を作成する方法
ここではある範囲内の小数乱数の作り方として
- 0~最大値までの少数乱数を作成
- 最小値~最大値までの少数乱数を作成
の2つのやり方を紹介します。
0~最大値までの少数乱数を作成
まず初めは最小値を 0 に固定して最大値までの乱数を作る方法
その式は最大値を $max とすると次のように書けます。
1 |
mt_rand() / mt_getrandmax() * $max |
mt_getrandmax() というのは乱数の最大値を返す関数
そして普通に mt_rand() を呼び出した場合、その最大値の範囲内の乱数がかえってきます。
それを最大値で割ることで 0 ~ 1 までの少数が得られるわけです。
あとは最大値をかけて範囲を伸ばしてやれば 0 ~ $max までの乱数の出来上がり
例えば次は 0 ~ 5 までの少数乱数を生成しているコード例
1 2 |
$max = 5; $rand_f = mt_rand() / mt_getrandmax() * $max; |
$rand_f には両端の 0と 5 を含む浮動小数点の乱数が入ります。
実際に値を表示してみると 1.4408352232728 みたいな値が表示されるはずです。
ちなみに小数点以下の桁数を制限するならround関数で丸めることも可能です。
例えば次は乱数を小数点以下3桁に丸めているコード例
1 2 3 |
/** 小数点以下3桁に丸める */ $max = 5; $rand_f = round( mt_rand() / mt_getrandmax() * $max, 3); |
上のコードのようにround関数に対して
- 第一引数に丸めたい値
- 第二引数に丸めたい桁数
を渡すことで丸められた値を取得することができます。
最小値~最大値までの少数乱数を作る
お次は最小値も指定して少数乱数を作る方法
その式は最小値 $min 、最大値 $max とすると次のように書けます。
1 |
$min + mt_rand() / mt_getrandmax() * ($max - $min) |
まず mt_rand() / mt_getrandmax() で0 ~ 1までの乱数を取得
($max - $min) をかけることで範囲を拡大、最小値 $min を足せば完成
このような処理をすることで指定範囲内の少数乱数が得られます。
例えば次は 3 ~ 5 までの少数乱数を生成するコード例
1 2 |
$min = 3; $max = 5; $rand_f = $min + mt_rand() / mt_getrandmax() * ($max - $min); |
$rand_f には両端の 3 と 5 も含んだ少数が入ります。
もし桁数を丸めたいなら先ほどのようにround関数を使えば丸めることも可能です。
ここまでのまとめ
少数乱数を発生させる方法まとめ
- 0~最大値までの少数乱数を作成
乱数の最大値を $max として次の式
1mt_rand() / mt_getrandmax() * $max - 最小値~最大値までの少数乱数を作成
乱数の最小値を $min 、最大値を $max として次の式
1$min + mt_rand() / mt_getrandmax() * ($max - $min)
もし少数を含む乱数が必要になった時はこの式を使うと便利です。