MersenneTwister没有提供随机数字?

时间:2014-05-10 03:01:39

标签: java random mersenne-twister

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

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

2 个答案:

答案 0 :(得分:4)

tl; dr:改为将new MersenneTwister()改为new MersenneTwister(new Date())

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

听起来你的生成器默认使用固定种子(MersenneTwister()的文档说&#34;构造并返回一个带有默认种子的随机数生成器,这是常数&#34; [强调原文])。当然,这将产生相同的数字流。

你应该使用MersenneTwister(Date)构造函数(只使用new MersenneTwister(new Date()))或MersenneTwister(int)构造函数(虽然这似乎不太理想,因为int只有32位宽)。

答案 1 :(得分:1)

Mersenne Twister是一种从种子中创建可预测,随机,相等分布数的算法。在您的情况下,您需要使用类似系统时间的种子来提供Twister,或者更好地为底层操作系统提供随机源。

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