为什么181783497276652981
被8682522807148012
选中Random.java
?
以下是 Java SE JDK 1.7 的相关源代码:
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}
private static long seedUniquifier() {
// L'Ecuyer, "Tables of Linear Congruential Generators of
// Different Sizes and Good Lattice Structure", 1999
for (;;) {
long current = seedUniquifier.get();
long next = current * 181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
因此,new Random()
在没有任何种子参数的情况下调用会采用当前的“种子唯一性”并将其与System.nanoTime()
. 然后它用于181783497276652981
创建另一个种子 uniquifier 以供下次存储new Random()
。
文字181783497276652981L
和8682522807148012L
没有放在常量中,但它们不会出现在其他任何地方。
起初,评论给了我一个简单的线索。在线搜索该文章会产生实际文章。 8682522807148012
没有出现在论文中,但181783497276652981
确实出现了——作为另一个数字的子字符串,1181783497276652981
,它181783497276652981
带有1
前缀。
该论文声称这1181783497276652981
是一个为线性同余生成器产生良好“优点”的数字。这个数字是否只是错误地复制到 Java 中?181783497276652981
有可接受的优点吗?
为什么被8682522807148012
选中?
在线搜索这两个数字都没有任何解释,只有这个页面也注意到1
前面的181783497276652981
.
是否可以选择与这两个数字一样有效的其他数字?为什么或者为什么不?