__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是经过精心挑选的”,但他们是如何被选中的?
答案 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
中的位数
(因为模运算是假定的,因此可能有无符号类型
需要)。关于如何选择a
,b
和m
的广泛文献
m
;一般来说,根据参考文件(随机数
发电机:良好的发现很难找到,Park和Miller,CACM,10月。
1988),b
应该是素数,a
通常可以是0;这个
生成器违反了这两个规则。 (违反第一个倾向于
使低阶位非常随机,这就解释了为什么结果
转移了。)
据我所知,确保选择m
和a
的唯一方法
好的是做广泛的统计测试,虽然有办法
找出一些不好的。对于初学者,m
和m
应该没有
共同因素。 (在最好的发电机中,两者通常都是素数。)
在这里,x
是2的幂,向{{1}}添加一个使其可以被2整除
同样,你或多或少地保证了生成的发电机
不会很好。
有关详细信息,我建议您阅读该文章。