人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: akibare
●カテゴリ:コンピュータ
✍キーワード:PHP Rand 乱数 関数
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● d金魚
●100ポイント

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;

}

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


http://www001.upp.so-net.ne.jp/isaku/rand.html

良い乱数・悪い乱数

より

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

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


http://us3.php.net/manual/en/function.mt-rand.php

PHP: mt_rand - Manual

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ