PRNG背后的理论是什么?

时间:2011-10-27 13:01:11

标签: c++ random theory

__forceinline static int Random()
{
    int x = 214013, y = 2531011;
    seed = (x * seed + y);
    return ((seed >> 16) & 0x7FFF) - 0x3FFF; 
}

上面的代码使PRNG返回正常的均匀分布。

现在将x更改为x + 1 - 结果序列不能再被称为PRNG。

那么PRNG背后的理论是什么? “x和y是经过精心挑选的”,但他们是如何被选中的?

3 个答案:

答案 0 :(得分:6)

这看起来像Linear congruential generator。当乘数x可被模数减去1的所有素因子(此处为0x3FFFFFFFF整除时,LCG更好,由于返回语句中的数学,它有点隐藏)。

答案 1 :(得分:4)

它是一个32位LCG,丢弃最低16位。我怀疑这个发生器对于有趣的目的是好的。对于简单的游戏,这应该足够了。

您的具体问题由我发布的链接回答:当且仅当x - 1是4的倍数时,生成器才会达到这个特定y的整个周期(维基百科的符号中,a是x,c是y,m是2 ^ 31)。

因此,当x为偶数时,发生器不是最优的。

答案 2 :(得分:1)

这是一个线性全等发生器。还应该有一个模数;该 经典公式是:

seed = (a * seed + b) % m;

在这种情况下,m只是2 ^ n,其中n是seed中的位数 (因为模运算是假定的,因此可能有无符号类型 需要)。关于如何选择abm的广泛文献 m;一般来说,根据参考文件(随机数 发电机:良好的发现很难找到,Park和Miller,CACM,10月。 1988),b应该是素数,a通常可以是0;这个 生成器违反了这两个规则。 (违反第一个倾向于 使低阶位非常随机,这就解释了为什么结果 转移了。)

据我所知,确保选择ma的唯一方法 好的是做广泛的统计测试,虽然有办法 找出一些不好的。对于初学者,mm应该没有 共同因素。 (在最好的发电机中,两者通常都是素数。) 在这里,x是2的幂,向{{1}}添加一个使其可以被2整除 同样,你或多或少地保证了生成的发电机 不会很好。

有关详细信息,我建议您阅读该文章。