Java中的默认seed-PRNG

Java中的默认seed-PRNG,java,random,prng,Java,Random,Prng,我想知道Java中Math.random()后面的PRNG*的默认种子是什么。据我所知,C中的一个是基于系统时钟的。那么它在Java中类似吗?此外,是否每次调用Math.random()时种子都会更改 *PRNG=伪随机数生成器您始终可以读取 Math.random()只使用一个内部静态随机对象,该对象实例化时没有参数 Random() { 90 this(seedUniquifier() ^ System.nanoTime()); 91 } 92 93

我想知道Java中
Math.random()
后面的PRNG*的默认种子是什么。据我所知,C中的一个是基于系统时钟的。那么它在Java中类似吗?此外,是否每次调用
Math.random()
时种子都会更改

*PRNG=伪随机数生成器

您始终可以读取

Math.random()
只使用一个内部静态随机对象,该对象实例化时没有参数

       Random() {
90         this(seedUniquifier() ^ System.nanoTime());
91     }
92 
93     private static long seedUniquifier() {
94         // L'Ecuyer, "Tables of Linear Congruential Generators of
95         // Different Sizes and Good Lattice Structure", 1999
96         for (;;) {
97             long current = seedUniquifier.get();
98             long next = current * 181783497276652981L;
99             if (seedUniquifier.compareAndSet(current, next))
100                return next;
101        }
102    }
103
104    private static final AtomicLong seedUniquifier = new AtomicLong(8682522807148012L);
正如您在上所看到的,该函数使用一个名为的类,它使用48位种子,并生成一个均匀分布。

如果它告诉您

第一次调用此方法时,它会创建一个新的 伪随机数生成器,与表达式完全相同

new java.util.Random()

使用了这种新的伪随机数发生器 此后,用于此方法的所有调用,并且不在其他地方使用

接下来是
java.util.Random()
,文档中说

public Random()

创建一个新的随机数生成器。此构造函数设置种子 将随机数生成器的 从该构造函数的任何其他调用

当前的实现似乎基于
System.nanoTime()
,但可能会发生变化,并且仍然符合文档的约定


至于在每次通话中更换种子,种子不是这样工作的。PRNG被播种一次,然后产生一系列从初始状态演化而来的值。你不应该,Java也不应该,继续重新播种。

如果我们使用像
rand.setSeed(System.currentTimeMillis())这样的东西
它说该语句使用当前时间作为种子,那么如果当前时间是20:01,那么种子或起始值将是20或01?还是2001年?@AHF是你的朋友。