2014-05-10 40 views
1

我想知道为什么下面的代码使用Mersenne Twister(在java中)总是给出相同的99个数字,无论我运行多少次。实质上它不是随机的?MersenneTwister不给随机数字吗?

MersenneTwister mt = new MersenneTwister(); 
    for(int i = 0; i<=99; i++) { 
     System.out.println("Next "+mt.nextDouble()); 
    } 
+0

这不是一个标准的Java类。什么库提供它?作为一种猜测,我会说它每次都会以相同的价值播种。 –

+0

http://acs.lbl.gov/software/colt/api/cern/jet/random/engine/MersenneTwister.html – SonicProtein

回答

4

TL;博士:改变你的new MersenneTwister()new MersenneTwister(new Date())代替。

伪随机数发生器使用种子来确定出来的数字的序列。如果不设置,发电机会默认设置种子。某些生成器每次默认使用不同的种子,例如使用计算机的时钟,或者从/dev/urandom读取。其他人默认使用固定的种子。

这听起来像您的发电机是使用默认固定的种子(MersenneTwister()的文档说‘构造并返回具有默认种子,其是恒定一个随机数发生器’[在原始强调])。这当然会导致相同的数字流。

您应该使用的MersenneTwister(Date)构造函数(只使用new MersenneTwister(new Date())),或MersenneTwister(int)一个(尽管这似乎不太理想,因为int只有32位宽)。

+0

所以首先我认为MT只是用32位序列扭曲,所以32“宽的”关键也不错。其次,取决于“好”日期,你可能会得到两个并行运行的进程的相同数字。 – chozilla

1

Mersenne Twister是一种从Seed中创建可预测的,随机分配的数字的算法。在你的情况下,你需要像系统时间那样给种子加上一个种子,或者更好地为底层操作系统提供的随机性来源。

Mersenne Twister只能在字节周围混合,所以你总能从相同的种子获得相同的结果。这很适合在游戏中创建虚拟世界,您可以使用重新创建千兆字节的数据,只需一个小种子。这是不是创建随机性的方法,而是从种子(可以是随机值或可预测的值(如日期))创建随机分布值的一种方法。