-5

私は(バングラー初心者として)このアルゴリズムを使用して乱数を生成しようとしています

/* initialize state to random bits */
static unsigned long state[16];
/* init should also reset this to 0 */
static unsigned int index = 0;
/* return 32 bit random number */
unsigned long WELLRNG512(void)
{
unsigned long a, b, c, d;
a = state[index];
c = state[(index+13)&15];
b = a^c^(a<<16)^(c<<15);
c = state[(index+9)&15];
c ^= (c>>11);
a = state[index] = b^c;
d = a^((a<<5)&0xDA442D20UL);
index = (index + 15)&15;
a = state[index];
state[index] = a^b^d^(a<<2)^(b<<18)^(c<<28);
return state[index];
}

しかし、うまくいかないようです(結果は毎回0です)。ここで見つけました ゲームに適した乱数ジェネレーターとは何ですか? コメントには、「コードが機能しない理由を理解するために一晩を無駄にしています。64ビットマシンでは、このコードは64ビット番号を生成します!使用しますsizeof(unsigned long) * 8」. 64ビットシステムを持っていますが、何をしなければならないのかわかりません! stdlib を使用する方が確実に優れています。

4

1 に答える 1

0

編集:問題に関する元の仮定は完全に間違っています。すべてゼロになる原因は、stateシードされていないことです。state「ランダム」なもので埋める必要があります。

このコードは機能します。この関数seed()が科学的に優れていることがまったく証明されていないことに注意してください。実際、シード内で可能な限り多くの「ビット」を取得しようとして、できるだけ多くの「ビット」を取得しようとして、作成しただけです。「乱数のシード」について調査する必要があります。(私もちょうどで種付けを試みましたstate[i] = i;が、それもかなりうまくいくようですが、最初の数回の反復でかなり似たような数値が得られます)。

#include <iostream>
#include <cstdint>

/* initialize state to random bits */
static uint32_t state[16];
/* init should also reset this to 0 */
static unsigned int index = 0;
/* return 32 bit random number */
uint32_t WELLRNG512(void)
{
    uint32_t a, b, c, d;
    a = state[index];
    c = state[(index+13)&15];
    b = a^c^(a<<16)^(c<<15);
    c = state[(index+9)&15];
    c ^= (c>>11);
    a = state[index] = b^c;
    d = a^((a<<5)&0xDA442D24UL);

    index = (index + 15)&15;
    a = state[index];
    state[index] = a^b^d^(a<<2)^(b<<18)^(c<<28);
    return state[index];
}

void seed()
{
    for(size_t i = 0; i < sizeof(state)/sizeof(state[0]); i++)
    {
    state[i] = (i << (24 + (i & 5))) ^ (i << 7) ^ (i << 6) ^ (i >> 2);
    }
}    

int main()
{
    using namespace std;
    seed();
    for(int i = 0; i < 50; i++)
    {
    cout << WELLRNG512() << endl;
    }
    return 0;
}
于 2013-04-22T09:11:21.980 に答える