【发布时间】:2011-07-16 22:06:42
【问题描述】:
在使用 Java 进行一些实验时,我的项目主管提醒我在实验的每次迭代中使用不同的编号。他还提到我应该使用素数作为种子值。这让我开始思考——为什么是素数?为什么没有其他数字作为种子?另外,为什么素数必须足够大?有任何想法吗?我自己会问他这个,但现在是凌晨 4 点,每个人都睡着了,我只记得这个问题,我很想知道答案(我相信你知道这种感觉)。
如果您能提供一些参考,那就太好了,我对这一切背后的数学/概念非常感兴趣!
编辑:
我正在使用 java.util.Random。
进一步编辑:
我的教授来自 C 背景,但我使用的是 Java。不知道这是否有帮助。使用素数似乎是他的特质,但我认为我们已经发现了一些关于生成随机数的有趣答案。感谢大家的努力!
【问题讨论】:
-
我真的很想看看他是不是满脑子都是废话。特别是因为对于
java.util.Random之类的东西,与使用默认的基于时间的种子相比,这会大大减少可能的序列。 -
听起来他把它和加密的东西搞混了。
-
如果是用于实验,那么您希望它们具有可重复性并且以@Mark Peters 的方式(基于时间的方式)进行操作会很糟糕。质数可能是一种获得不同但确定性的起始值分布的方法。对于一个好的随机数生成器,只使用 1,2,3... 也应该这样做。
-
关于我之前所说的关于使用质数缩小域而不是使用时间......两者都不相关。在接下来的一百万年中,长域中的素数是毫秒数的许多倍。我们也不会很快筋疲力尽。所以我不认为对种子值使用素数序列会影响熵,但我也不认为有充分的理由。
-
@Mark,java.util.Random 不使用
System.currentTimeMillis(),而是类似:public Random() { this(++seedUniquifier + System.nanoTime()); } private static volatile long seedUniquifier = 8682522807148012L;
标签: java algorithm random seed