PHP: rand - Manual
On some platforms (such as Windows) RAND_MAX is only 32768.
例えばWindowsでは RAND_MAX は 32768.(翻訳間違っているかもしれません)
との事でこの32768というのはC言語の標準乱数rand()でも使われていた覚えがあったので実際ソースコードをダウンロードして見てみました。
php-5.1.2では
rand()の実装は
PHPAPI long php_rand(TSRMLS_D)
{
long ret;
if (!BG(rand_is_seeded)) {
php_srand(GENERATE_SEED() TSRMLS_CC);
}
#ifdef ZTS
ret = php_rand_r(&BG(rand_seed));
#else
# if defined(HAVE_RANDOM)
ret = random();
# elif defined(HAVE_LRAND48)
ret = lrand48();
# else
ret = rand();
# endif
#endif
return ret;
}
となっており、コンパイルオプションによりどれもアルゴリズムが違うので一概に質については問うのはコンパイルオプションによる?ような気がします。
より
上記の関数に記述されている関数は
出力値の下位ビットおよび上位ビットのみを使う場合はランダムな値にはならないことが多いので注意が必要と書いてました。(ようやく間違えていたらスミマセン。)他にも様々な問題点を指摘されています。
http://us3.php.net/manual/en/function.mt-rand.php
PHP: mt_rand - Manual
なのでPHPでよい質の乱数を使う場合は
Mersenne Twisterで生成される乱数を使ったほうが良いと思います。
すばらしい。ありがとうございます。