仅使用素数为随机数生成器播种有什么好处?

时间:2011-03-16 20:23:03

标签: java algorithm random seed

在Java中进行一些实验时,我的项目主管提醒我用不同的数字为实验的每次迭代播种。他还提到我应该使用素数作为种子值。这让我思考 - 为什么要素数?为什么没有任何其他数字作为种子?另外,为什么素数必须足够大?有任何想法吗?我自己会问他这个,但是现在凌晨4点,每个人都睡着了,我只记得这个问题,我很想知道答案(我确定你知道这种感觉)。

如果你能提供一些参考资料会很好,我对所有这些背后的数学/概念非常感兴趣!

修改

我正在使用java.util.Random。

进一步编辑:

我的教授来自C背景,但我正在使用Java。不知道这是否有帮助。似乎使用素数是他的特质,但我认为我们已经发现了一些关于生成随机数的有趣答案。感谢大家的努力!

3 个答案:

答案 0 :(得分:23)

实施的一眨眼就会告诉你,他根本没有任何理由要求这个说法。为什么?因为这就是set seed函数的样子:

synchronized public void setSeed(long seed) {
    seed = (seed ^ multiplier) & mask;
    this.seed.set(seed);
    haveNextNextGaussian = false;
}

这正是构造函数调用的内容。因此,即使你给它一个素数,也无论如何都不会使用它,所以如果你需要使用种子,那么(s ^乘数)&掩码导致素数;)

Java使用通常的线性一致性方法,即:

x_n + 1 =(a * x_n + c)mod m,其中2 <= a <1。米; 0&lt; = c&lt; 0米。

由于你想得到一个最大的periode,c和m必须是相对质数和一些其他相当模糊的限制,加上一些提示如何获得一个实用的版本。 Knuth显然在第2部分详细介绍了这一点;)

但无论如何,种子根本不会影响发电机的质量。即使实现将使用Lehmer生成器,显然也会确保N是素数(否则算法实际上是无用的;如果所有随机值必须与非素数NI下注相互作用,则不均匀分布)有点没有意义

答案 1 :(得分:21)

如果发电机是莱默发电机,那么种子和模数必须是共同的;见the wiki page。确保它们是共同素数的一种方法是从素数开始。

答案 2 :(得分:11)

如果您在谈论java.util.Random或Oracle运行时中的一个子类,则没有理由这样做。这只是你主管的心血来潮。