我想知道为什么下面的代码,使用 Mersenne Twister(在 java 中),无论我运行多少次,总是给出相同的 99 个数字。本质上它不是随机的?
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++ ) {
System.out.println("Next "+mt.nextDouble());
}
我想知道为什么下面的代码,使用 Mersenne Twister(在 java 中),无论我运行多少次,总是给出相同的 99 个数字。本质上它不是随机的?
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++ ) {
System.out.println("Next "+mt.nextDouble());
}
tl;博士:new MersenneTwister()
改为new MersenneTwister(new Date())
改为。
伪随机数生成器使用种子来确定出现的数字序列。如果您不设置,生成器将默认设置种子。某些生成器每次默认使用不同的种子,例如使用计算机的时钟,或从/dev/urandom
. 其他人将默认使用固定种子。
听起来您的生成器默认使用固定种子(MersenneTwister()
的文档说“构造并返回具有默认种子的随机数生成器,这是一个常数” [强调原始])。当然,这将产生相同的数字流。
您应该使用MersenneTwister(Date)
构造函数(仅使用new MersenneTwister(new Date())
)或构造函数(MersenneTwister(int)
尽管这似乎不太理想,因为int
它只有 32 位宽)。
Mersenne Twister 是一种算法,用于从种子中创建可预测的、随机的、均匀分布的数字。在您的情况下,您需要为 Twister 提供像系统时间这样的种子,或者更好的是底层操作系统提供的随机源。
Mersenne Twister 只混合字节,所以你总是会从同一个种子中得到相同的结果。这非常适合在游戏中创建虚拟世界,您只需一个小种子就可以重新创建千兆字节的数据。这不是一种创建随机性的方法,而是一种从种子创建随机分布值的方法(可以是随机值或可预测的值,如日期)。