为什么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核盒子上变得非常有竞争力。本地线程本来可以更扩展。

