PHPで乱数を生成するrand()を調べた

http://www.php.net/manual/ja/function.srand.php を見ると、

注意: PHP 4.2.0 以降、 srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。 これは、この処理が自動的に行われるためです。

と、あったので、どんなもんかと検索してみたところ http://d.hatena.ne.jp/yoya/20080807 に行き着いた。

で、実際どうなってるんだ?と思いソースを調べてみた。

/ext/standard/rand.c の65行目に

php_srand(GENERATE_SEED() TSRMLS_CC);

があって、これが /ext/standard/php_rand.h の 52行目の

#define GENERATE_SEED() ((long) (time(0) * getpid() * 1000000 * php_combined_lcg(TSRMLS_C)))

で、php_combined_lcgは /ext/standard/lcg.c にあって、そこからlcg_seed()に行き着いたんだけど、

if (gettimeofday(&tv, NULL) == 0) {
LCG(s1) = tv.tv_sec ^ (~tv.tv_usec);
} else {
LCG(s1) = 1;
}

以下の部分でなぜランダムになるのか良くわからず。。

コメントを残す

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