アカウント名:
パスワード:
rand( )その1 UNIX の /usr/ucb/cc、gcc、g++を解析した結果、 rand( ) は以下の動作をすることがわかった。 static long x=1;void srand(unsigned s) { x=s; }long rand() { x=x*1103515245+12345; return x&2147483647; } これは、非常にシンプルな線形合同法である。この乱数の最下位ビットは0と1の繰り返しになる。すなわち、偶数と奇数が交互に生成される
ほとんどの応用では、下位ビットは重要な意味をもたず、m = wとしても満足できる。――ただし、乱数を使うプログラマが乱数を賢く使うことを前提としてである。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
身近な人の偉大さは半減する -- あるアレゲ人
理解できん (スコア:0)
何でこんなことになったの?
Re:理解できん (スコア:5, 参考になる)
Re:理解できん (スコア:2, 参考になる)
もしrand()が [0,1) のdoubleを返していたら、定番の「6を掛けて整数に切り捨て1を足す」というイディオムを使わざるを得ず、こういうバグは起きなかった。乱数を返す関数に小数を返す言語が多いのはこのあたりが理由ですかねえ。
ちなみに、ワードサイズ w (例えば2^31)の計算機における x[n+1] = ( a * x[n] + c) mod m の線形合同法について、Knuth翁は、m = w では最下位ビットは「定数になるか、確実に交代する」(やや不自然な訳)ので m = w±1 の方が望ましいが、 といわれております。
『The Art of Computer Programming Volume 2 Seminumerical Algorithms 日本語版』Donald E. Knuth著、有沢誠他監訳