そこで、Mersenne Twister を使用するカスタムのランダマイザー クラスを作成しました (使用するコードは、このサイトから変更されています)。さまざまなシードのテストを開始するまで、すべてがうまく機能しているように見えました (通常、シードとして 42 を使用して、プログラムを実行するたびに結果が同じであることを確認し、コードの変更が物事にどのように影響するかを確認できるようにします)。
どのシードを選択しても、コードは毎回まったく同じ一連の数値を生成することがわかりました。明らかに私は何か間違ったことをしているのですが、何が悪いのかわかりません。ここに私のシード関数があります:
void Randomizer::Seed(unsigned long int Seed)
{
int ii;
x[0] = Seed & 0xffffffffUL;
for (ii = 0; ii < N; ii++)
{
x[ii] = (1812433253UL * (x[ii - 1] ^ (x[ii - 1] >> 30)) + ii);
x[ii] &= 0xffffffffUL;
}
}
そして、これは私の Rand() 関数です
unsigned long int Randomizer::Rand()
{
unsigned long int Result;
unsigned long int a;
int ii;
// Refill x if exhausted
if (Next == N)
{
Next = 0;
for (ii = 0; ii < N - 1; ii++)
{
Result = (x[ii] & U) | x[ii + 1] & L;
a = (Result & 0x1UL) ? A : 0x0UL;
x[ii] = x[( ii + M) % N] ^ (Result >> 1) ^ a;
}
Result = (x[N - 1] & U) | x[0] & L;
a = (Result & 0x1UL) ? A : 0x0UL;
x[N - 1] = x[M - 1] ^ (Result >> 1) ^ a;
}
Result = x[Next++];
//Improves distribution
Result ^= (Result >> 11);
Result ^= (Result << 7) & 0x9d2c5680UL;
Result ^= (Result << 15) & 0xefc60000UL;
Result ^= (Result >> 18);
return Result;
}
さまざまな値は次のとおりです。
#define A 0x9908b0dfUL
#define U 0x80000000UL
#define L 0x7fffffffUL
int Randomizer::N = 624;
int Randomizer::M = 397;
int Randomizer::Next = 0;
unsigned long Randomizer::x[624];
異なるシードが異なる数のシーケンスにならない理由を理解するのを手伝ってくれる人はいますか?