只用质数为随机数生成器设定种子有什么好处?

2022-09-01 10:34:50

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

如果你能提供一些参考,那就太好了,我对这一切背后的数学/概念非常感兴趣!

编辑:

我正在使用java.util.Random。

进一步编辑:

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


答案 1

好吧,在实现时眨一下就会告诉你,他根本就没有任何理由提出这种说法。为什么?因为这就是 set seed 函数的样子:

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

这正是构造函数所称的。因此,即使你给它一个素数,它也不会以任何方式使用它,所以如果你必须使用种子s,其中(s^乘数)和掩码导致素数;)

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

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

由于你想要获得一个最大周期,c和m必须是相对素数和其他一些非常模糊的限制,以及一些如何获得实际有用的版本的提示。Knuth显然在第2部分中详细介绍了这一点;)

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


答案 2

如果发生器是莱默发生器,则种子和模量必须是共素数;请参阅维基页面。确保它们是共素数的一种方法是从素数开始。