乱数の質について教えてください。特に、PHPが実装しているRAND関数の質について。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:studiokingyo No.1

回答回数47ベストアンサー獲得回数2

ポイント100pt

http://jp.php.net/rand

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;

}

となっており、コンパイルオプションによりどれもアルゴリズムが違うので一概に質については問うのはコンパイルオプションによる?ような気がします。


より

上記の関数に記述されている関数は

出力値の下位ビットおよび上位ビットのみを使う場合はランダムな値にはならないことが多いので注意が必要と書いてました。(ようやく間違えていたらスミマセン。)他にも様々な問題点を指摘されています。


なのでPHPでよい質の乱数を使う場合は

Mersenne Twisterで生成される乱数を使ったほうが良いと思います。

id:akibare

すばらしい。ありがとうございます。

2006/01/16 16:06:58

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません