夏休みも後一週間。
有意義に過ごしましょう。
今回は乱数について。
c言語で「rand」を呼び出しランダムな数値を取得していますよね。
そして戻り値は「int型」なのに数値は「0~32767」までと少ない数値が帰ってきています。
どういう計算が行われているのでしょうか。
[0回]
------------------------------------------------------------------------------
Visual C++
static long x = 1;
int rand() { x = x * 214013 + 2531011; return ( int ) ( x >> 16 ) & 32767; }
void srand(long s) { x = s; }
------------------------------------------------------------------------------
コンパイラによって条件が変わってきます。
これは線形合法性という形です。
xの値は漸化式(再帰式)
X[n]=A*X[n-1]+C (mod 4294967296)
に基づいて計算される。
そして上位16ビットを右シフトしてその内の下位15ビットを返す。
さて、ここで乱数の数値範囲である「0~32767」の原因が見えてきましたね。
計算速度としてはまずまずの所なのだが、15bitでは精度が悪い。
また、種によって取得する数列は変わるのだがある大きな数値にまで行くと数列が同じになったりもする。
いろいろ問題を抱えた乱数生成関数。 その問題点を解決したものとして「メルセンヌツイスタ」や「XorShift」などがある。
もし興味があれば調べて、自分の知識をひろげましょう。
PR
COMMENT