__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
, b
和m
;一般按参考文档(随机数)生成器:好的很难找到, Park and Miller, ccm, 10月。1988), m
应为素数,b
通常为0;这Generator违反了这两条规则。(违反第一种倾向于使低阶位非常非随机,这就解释了为什么结果转移。)
据我所知,唯一能保证a
和m
选择的方法好的是做大量的统计检验,虽然有办法找出一些不好的。对于初学者来说,a
和m
应该没有常见的因素。(在最好的生成器中,两者通常都是质数。)这里,m
是2的幂,x
加1能被2整除因此,您或多或少可以保证生成的生成器不会很好。