两个问题:
每次输入不同的种子,我会得到不同的数字序列吗?
是否存在一些“失效”的种子?(产生零或非常快地重复。)
顺便问一下,除了Mersenne Twister,我还可以使用其他 PRNG 吗?
解决方案:由于我将使用 PRNG 制作游戏,因此不需要它是加密安全的。为了速度和极长周期,我选择使用 Mersenne Twister。
public long randomLong() {
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
return x;
}
这在文档中有描述。线性同余发生器在理论上已经得到了很好的理解,并且有很多关于它们的材料可以在文献和互联网上找到。具有相同参数的线性同余生成器总是输出相同的周期序列,而种子唯一决定的是序列开始的位置。因此,对于您的第一个问题的答案是:“是的,如果您生成足够多的随机数。”
请在我的博客文章中查看答案:
http://code-o-matic.blogspot.com/2010/12/how-long-is-period-of-random-numbers.html
随机数的状态有最大周期(即长达2^64的周期)。这可以直接推广到2^k - 投入尽可能多的状态位,就能获得最大周期。相比之下,Mersenne Twister仅具有非常短的周期(请参见上述博客文章中的评论)。
-- 糟糕。随机数实际上只使用了长整型的48个位,而不是全部64个位,因此其周期实际为2 ^ 48,而不是2 ^ 64。
(我并不主张人们自己设计算法,只是自己实现。大多数人,包括我在内,没有开发自己算法的能力。编写一个你认为很棒的烂生成器很容易。这就是为什么人们需要像这个问题一样询问,想知道库生成器是多好。我提到的生成器中的算法已经经过了许多同行评审的考验。)