エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

PHPで擬似乱数を作ってみよう【109日目】

擬似乱数を作ってみよう!

ってことで、すっごく簡単に作ってみよう。

アクセスする時間に応じて、数値を返せば実質乱数じゃね?ってことでプログラム。

<?php
    echo randsan();

    function randsan() {
        echo (microtime() * 100) % 101;
    }

はいかんせー!

でも問題が・・・

でもこれ、0.001秒より早いスピードでアクセスされると、同じ数値が出てしまう・・・

<?php
    for($i = 0; $i < 20; $i++) {
        echo randsan();
    }

    function randsan() {
        echo (microtime() * 100) % 101;
    }

これとかね。

なら、アクセス回数の要素も付け加えよう!

擬似乱数

<?php
    for($i = 0; $i < 20; $i++) {
        echo (randsan() . PHP_EOL);
    }

    //時間と回数の2変数で作る
    function randsan($count = 0) {
        if(isset($GLOBALS["randsan"])) {
            // 素数を足しただけで1でもいいです
            $GLOBALS["randsan"] += 13;
            $GLOBALS["randsan"] %= 100;
        } else {
            $GLOBALS["randsan"] = 0;
        }
        echo ((microtime() * 100) + $GLOBALS["randsan"]) % 101;
    }

これでアクセスする度に違うしバッチリだね!

でもこれにも問題が・・・

これ、同じプログラムを、同時に別のPCで実行したら同じ乱数の値が出るよね・・・

じゃあIPで制限する・・・?あれ・・・?これ無限に無理じゃね・・・?

だから擬似乱数

ってことで、ソフトウェアで完璧な乱数とか無理じゃねっていうお話。

だから擬似乱数って呼ばれるんですね。

ちなみに、先輩からハードウェア乱数生成器なるワードをいただきました。
気になる方は調べてみてくださいね。

日記

また1つ課題を消化。
いろんな学びあるの良いこと。

そして昨日の課題、なんでクラス化するの問題が。。。
オブジェクトにするなら、ハノイの塔の配列、移動、表示までのクラスにすればよかった。
ハノイの塔を解くのはまた別のお話ですね。

なんにしても、なぜクラス化するの?どんなオブジェクトを作るの?
っていうのは、いっぱい作っていかなきゃ、慣れない気がします。

1の課題でいろんな気付きをいただけるから、本当に先輩方には感謝なのです・・・!