Java中的默认种子PRNG

时间:2013-11-19 00:20:19

标签: java random prng

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

* PRNG =伪随机数发生器

3 个答案:

答案 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位种子,并生成均匀分布。