为什么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
创建另一个要存储的种子唯一化器,以供下次new Random()
调用。
文字181783497276652981L
和8682522807148012L
不会放置在常量中,但是它们不会出现在其他任何地方。
起初,评论给了我一个轻松的线索。在线搜索该文章会产生实际的文章。 8682522807148012
没有出现在纸上,但181783497276652981
确实出现-作为另一个号码,一个子1181783497276652981
,这是181783497276652981
一个1
前缀。
该论文声称,1181783497276652981
这个数字对于线性同余生成器具有良好的“优点”。这个数字是否只是简单地复制到Java中?是否181783497276652981
有一个可以接受的优点?
为什么8682522807148012
选择了?
在线搜索任何一个数字都不会产生任何解释,只有该页面还注意到1
前面的掉落181783497276652981
。
是否可以选择其他与这两个数字一样有效的数字?为什么或者为什么不?
seedUniquifier
可以在64核盒子上变得非常有竞争力。本地线程本来可以更扩展。