我想知道Java中Math.random()
后面的PRNG *的默认种子是什么。根据我的理解,C中的那个基于系统时钟。它在Java中是否相似?此外,每次调用Math.random()
时种子都会更改吗?
* PRNG =伪随机数发生器
答案 0 :(得分:4)
您随时可以阅读code。
Math.random()
只使用一个内部静态Random对象,该对象实例化时没有args ...
Random() {
90 this(seedUniquifier() ^ System.nanoTime());
91 }
92
93 private static long More ...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
答案 1 :(得分:3)
如果你Read The Fine Manual它告诉你
首次调用此方法时,它会创建一个新方法 伪随机数生成器,就像表达式
一样
new java.util.Random()
使用这个新的伪随机数生成器 此后对所有这种方法的调用都没有在其他地方使用。
跟进java.util.Random()
,文档说
public Random()
创建一个新的随机数生成器。此构造函数设置种子 随机数生成器的值很可能是不同的 来自此构造函数的任何其他调用。
当前的实施似乎基于System.nanoTime()
,但可能会更改并仍然符合文档的合同。
至于每次通话都要改变种子,那不是种子的运作方式。 PRNG被播种一次,然后产生一系列从初始状态演变而来的值。你不应该,Java也不应该继续重播。
答案 2 :(得分:0)
正如您在documentation上看到的那样,该函数使用一个名为Random()的类,它使用48位种子,并生成均匀分布。