c++ - Mersenne Twister 种子没有效果

标签 c++ random mersenne-twister

所以我有一个使用 Mersenne Twister 的自定义随机发生器类(我使用的代码改编自 this site)。一切似乎都运行良好,直到我开始测试不同的种子(我通常使用 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];

谁能帮我弄清楚为什么不同的种子不会产生不同的数字序列?

最佳答案

您的 Seed() 函数分配给 x[0],然后在 ii=0 处开始循环,这将覆盖 x[0]具有未定义的值(它引用 x[-1])。从 1 开始循环,您可能已经准备就绪。

编写自己的随机数发生器很危险。为什么?很难做到正确(见上文),很难知道你是否做对了,如果做错了,依赖于正确分布的随机数的东西将不会完全正确地工作。希望那件事不是尾部重要的密码学或统计建模....考虑使用std::random ,或者如果你还没有使用 C++11,boost::random .

关于c++ - Mersenne Twister 种子没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10986373/

相关文章:

c++ - 重载数组访问运算符时如何访问 SIMD vector 元素?

c++ - 如何为顶点数组中的纹理设置动画?

R:使用 Mersenne-Twister 种子将来自 runif 的随机值极端聚集

c++ - 总是必须在 Windows 上的 Eclipse 中定义 PATH 变量

c++ - 代理 QtConcurrent::run 函数的可变参数模板

java - 我应该定期重新播种 SecureRandom 还是自动发生?

python - 如何在 Python Pandas 中使用一致的随机样本?

r - 基于多类观察划分r中的数据集

python - Python 中的梅森数公式