我想知道为什么下面的代码,使用Mersenne Twister(在java中)总是给出相同的99个数字,无论我运行多少次。实质上它不是随机的?
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++ ) {
System.out.println("Next "+mt.nextDouble());
}
答案 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只混合字节,因此您将始终从同一种子获得相同的结果。这很适合在游戏中创建虚拟世界,只需一个小种子就可以重新创建千兆字节数据。 不是创建随机性的方法,而是一种从种子创建随机分布值的方法(可以是随机值或可预测的值,如日期)。