30

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

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

编辑:

我正在使用 java.util.Random。

进一步编辑:

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

4

3 回答 3

23

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

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

这正是构造函数调用的内容。因此,即使您给它一个质数,它也不会使用它,所以如果您必须使用种子 s where (s^ multiplier) & mask 会导致质数;)

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

x_n+1 = (a * x_n + c) mod m with 2 <= a < m; 0 <= c < 米。

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

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

于 2011-03-16T21:19:38.920 回答
22

如果生成器是 Lehmer 生成器,则种子和模数必须互质;见维基页面。确保它们互质的一种方法是从质数开始。

于 2011-03-16T20:29:47.977 回答
12

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

于 2011-03-16T20:26:49.837 回答