[PHP] mt_rand関数を使う

なんかちょっと、
ゲームっぽい物を作ってみたいなということで、

ゲームと言えばランダム要素が必要ですよね。
なので、ランダムな数値を返す関数を、
使ってみます。

mt_rand(MIN,MAX)

https://www.phpbook.jp/func/math/index1.html

MINからMAXの間の数値を、
ランダムに返す関数。

これを使って簡単に、
おみくじプログラムを作ってみた。

"omikuji.php"
=======================================
<!DOCTYPE html>
<head><title>おみくじ</title></head>
<body>
<?php

if(!empty($_POST['type']) && $_POST['type'] == 'result'){
/* POSTデータ    に"type='result'"がある場合は、くじを引いて結果を表示 */
    $result = [
        '大吉',
        '中吉',
        '吉',
        '末吉',
        '小吉',
        '凶',
        '大凶'
    ];

?>

<p>今回の結果は、</p>
<p><?=$result[mt_rand(0,count($result)-1)] ?></p>
<p><input type="button" onclick="location.href='omikuji.php'" value="戻る"></p>

<?php } else { /* else TOP画面を表示 */ ?>

<p>おみくじ</p>
<p>
    <form method="POST" action="omikuji.php">
        <input type="submit" value="引く">
        <input type="hidden" name="type" value="result">
    </form>
</p>
<?php } /* if-else 終わり*/?>

</body>
</html>
=======================================

“大吉”~”大凶”の配列を作って、
0~(配列の要素数-1)の間で、ランダムな数を生成。
生成された数に応じた結果を表示させるプログラム。

結果はこんな感じで出ます。
 

素っ気ないですねw

ちなみに、このプログラムはこちら

で、ここでやっぱり、
このmt_rand関数の実力というか、
本当にランダムなのか?
偏りとかは無いのか?

っていうのが気になりますよね。

なので、試しのプログラムを作って、
結果を見てみました。

<?php
$parameter = 10000;    // mt_randを実行する回数
$rand_min = 1;            // MIN
$rand_max = 10;            // MAX

$buf = array_pad(array(), $rand_max - $rand_min + 1, 0);

for($i = 1; $i < $parameter; $i++){
    $sample = mt_rand($rand_min,$rand_max);
    $buf[$sample - $rand_min]++;
}
?>
<!DOCTYPE html>
<head>
<title>mt_rand test</title>
</head>
<body>
<table border="1">
<tr><th>No.</th><th>times</th><th>rate</th></tr>
<?php
for($i = $rand_min; $i <= $rand_max; $i++){
    print("<tr align=\"right\"><td>".$i."</td>");
    print("<td>".$buf[$i-$rand_min]."回</td>");
    printf("<td>%.2f%%</td></tr>\n",$buf[$i-$rand_min]/$parameter*100);
}
?>
</table>
</body>
</html>

mt_rand関数の結果通り分のバッファ(配列)を作り、
結果の回数をカウントする。
で、結果の回数とその割合を出力します。

実際やってみた結果がこれです。(1~10で、実行回数10000回)

No. times rate
1 985回 9.85%
2 1040回 10.40%
3 1009回 10.09%
4 967回 9.67%
5 1027回 10.27%
6 987回 9.87%
7 996回 9.96%
8 967回 9.67%
9 1026回 10.26%
10 995回 9.95%

なんか、それとなく、
10±0.5%以内くらいで同じくらいの回数になってますね。

実行回数増やすと、
ばらつきがさらに少なくなります。
1000000回でやったら、±0.1%以内に収まりました。

ランダム性は確かということで。

カテゴリーphp

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です