Gar*_*ckW 0 c++ random mersenne-twister
所以我有一个使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的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;
}
Run Code Online (Sandbox Code Playgroud)
各种价值观是:
#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];
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我弄清楚为什么不同的种子不会产生不同的数字序列?
您的Seed()函数分配给x[0],然后开始循环ii=0,x[0]用未定义的值覆盖(它引用x[-1]).从1开始你的循环,你可能已经完成所有设置.
编写自己的随机数发生器很危险.为什么?很难做到正确(见上文),很难知道你是否做得对,如果错了,依赖正确分布的随机数的东西将无法正常工作.希望这个东西不是密码学或统计建模,尾巴很重要....想想使用std :: random,或者如果你还没有使用C++ 11,那么boost :: random.