Java中的默认seed-PRNG
我想知道Java中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
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是你的朋友。