情弱エンジニアのなかのblog

一人前のエンジニアになる為のブログです

phpでランダムな処理があるアプリの注意点

乱数生成!

アプリでランダムな数値を扱う処理を作ったのですが、なにやら偏りがあるということが発覚したので その対処等を記載致します。

1.rand()は偏る?

アプリでランダムな処理をする時にshuffle()を使っていたのですが、 どうやらshuffle()では内部でrand()を使っているようです。

ただこのrand()が問題でして、多少の偏りがあるようです。

2.mt_rand()を使う!

mt_rand()はrand()よりも高速かつ乱数生成において優秀との情報を見つけたので こちらを使っていきます。 普通にmt_rand()を使うか、どうしてもshuffle()を使わなきゃいけない場合は 以下のコードを参考にしてください。

function mt_shuffle($array) {

        $cnt = count($array);

        //渡される配列の添え字は$cntより1少ない数値~0なので$cnt -1をする
        for($i = $cnt -1; $i > 0; $i--) {

            $j = mt_rand(0 , $i);
            if($i !== $j) {
                //配列の中身を入れ替える
                list($array[$i], $array[$j]) = [$array[$j], $array[$i]];
            }
        }
}

このような形でランダムな処理を実装できます。 が、これでも偏りが全く出ないわけではないのでそこは注意してください。

今回の記事を書くにあたり以下のサイトを参考に致しました。

PHP関数 - 乱数を生成 - mt_rand() - PHP入門のカルマ

それでは