从我的研究来看,每个人似乎都说 java random 在未指定时使用系统时间(以毫秒为单位)作为其默认种子。因此,如果我们在生成随机数的那一刻有系统时间,我们应该能够知道是什么种子生成了该数字。
所以,
(new Random()).nextLong;
long time = System.currentTimeMillis();
(new Random(time)).nextLong
应该产生两个相同的数字,因为种子是相同的,对吗?事实并非如此,要么它不使用 TimeMillis 作为种子,要么我做错了其他事情。非常感谢您的帮助,我已经搜索了几个小时,但似乎找不到一致的答案。我只想确切地知道当没有指定种子时它是如何找到种子的。我的想法是也许它确实使用了系统时间,但在进入最终种子之前它会乘以它等等。
再次感谢 :)
最佳答案
Java曾经使用系统时间作为默认种子,最高到1.4.2。在 1.5 中,这个“错误”被修复了。比较 1.4.2 API specification :
使用 1.5 API specification :
OpenJDK 中的当前实现使用静态 AtomicLong
,每次创建没有种子的新 Random
实例时都会更新该代码。如果您在本地没有源代码,您可以在 source code on github 中找到它:
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 * 1181783497276652981L;
if (seedUniquifier.compareAndSet(current, next))
return next;
}
}
private static final AtomicLong seedUniquifier
= new AtomicLong(8682522807148012L);
关于java - java Random() 如何找到种子?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62919895/