PRNG背后的理论是什么?

What is the theory behind this PRNG?

本文关键字:是什么 理论 背后 PRNG      更新时间:2023-10-16
__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是经过精心挑选的"但它们是如何被挑选出来的呢?

这看起来像一个线性同余生成器。当乘数x可以被模数减1的所有质因数整除时(这里是0x3FFFFFFFF,由于返回语句中的数学运算,它有点隐藏),LCG更好。

32位LCG,丢弃最低16位。我怀疑这个生成器是否适合有趣的用途。对于简单的游戏,这应该足够了。

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

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

这是一个线性全同生成器。也应该有一个模;的经典公式为:

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

在这种情况下,m只是2^n,其中n是seed的位数(可能是unsigned类型,因为模运算是需要)。关于如何选择a, bm;一般按参考文档(随机数)生成器:好的很难找到, Park and Miller, ccm, 10月。1988), m应为素数,b通常为0;这Generator违反了这两条规则。(违反第一种倾向于使低阶位非常非随机,这就解释了为什么结果转移。)

据我所知,唯一能保证am选择的方法好的是做大量的统计检验,虽然有办法找出一些不好的。对于初学者来说,am应该没有常见的因素。(在最好的生成器中,两者通常都是质数。)这里,m是2的幂,x加1能被2整除因此,您或多或少可以保证生成的生成器不会很好。