C++ 梅森麻花籽没有效果

C++ 梅森麻花籽没有效果,c++,random,mersenne-twister,C++,Random,Mersenne Twister,因此,我有一个自定义的随机化器类,它使用Mersenne Twister(我使用的代码是改编自)。在我开始测试不同的种子(我通常使用42作为种子,以确保每次运行我的程序时,结果都是相同的,这样我就可以看到代码更改是如何影响事情的)之前,所有这些似乎都工作得很好 事实证明,无论我选择什么种子,代码每次都会产生完全相同的数字序列。很明显我做错了什么,但我不知道是什么。以下是我的种子函数: void Randomizer::Seed(unsigned long int Seed) { int

因此,我有一个自定义的随机化器类,它使用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;
    }
}
有人能帮我弄清楚为什么不同的种子不会产生不同的数字序列吗?

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

编写自己的随机化程序是危险的。为什么?很难做到正确(见上文),很难知道你是否做对了,如果做错了,依赖于正确分布的随机数的事情不会完全正确。希望这件事不是密码学或统计建模,因为尾部很重要。。。。考虑使用,或者如果您还没有使用C++11,。

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


编写自己的随机化程序是危险的。为什么?很难做到正确(见上文),很难知道你是否做对了,如果做错了,依赖于正确分布的随机数的事情不会完全正确。希望这件事不是密码学或统计建模,因为尾部很重要。。。。考虑使用,或者如果您还没有使用C++11,请使用。

是的,就是这样!谢谢现在不同的种子生产不同的系列,每个种子总是生产相同的。我想知道这是怎么回事,因为我最初是复制粘贴代码的……不,这不是什么严重的事情——这只是一个业余爱好项目。我自己做这件事并没有什么特别的原因,我只是在读关于RNG的书,发现了那个代码,我想我会试试看它是否能正常工作。我很欣赏整个“让我们修补一下,看看会有什么结果”的态度(而且你可能已经直接复制粘贴了代码),但有一点要小心:密码学和PRNG都是黑魔法。即使对于专家来说,它们也很难做出正确的判断,而且会以非常奇怪和不可预测的方式咬人。因此,除非你是专家,否则没有任何理由设计你自己的加密算法或PRNG,也没有任何理由“调整”现有的标准设计(如AES或L'Ecuyer/Bays Durhman PRNG),使其更好,因为你绝大多数不会这样做。是的,就是这样!谢谢现在不同的种子生产不同的系列,每个种子总是生产相同的。我想知道这是怎么回事,因为我最初是复制粘贴代码的……不,这不是什么严重的事情——这只是一个业余爱好项目。我自己做这件事并没有什么特别的原因,我只是在读关于RNG的书,发现了那个代码,我想我会试试看它是否能正常工作。我很欣赏整个“让我们修补一下,看看会有什么结果”的态度(而且你可能已经直接复制粘贴了代码),但有一点要小心:密码学和PRNG都是黑魔法。即使对于专家来说,它们也很难做出正确的判断,而且会以非常奇怪和不可预测的方式咬人。因此,除非您是专家,否则没有任何理由设计您自己的加密算法或PRNG,也没有任何理由“调整”现有的标准设计(例如AES或L'Ecuyer/Bays Durhman PRNG)以使其更好,因为您不愿意这样做的可能性非常大,C++11定义了几个新的随机数生成工具,包括Mersenne twister:作为参考,C++11定义了几个新的随机数生成工具,包括Mersenne twister:
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];