Java MersenneTwister没有给出随机数?
我想知道为什么下面的代码,使用Mersenne Twister(java),无论我运行多少次,总是给出相同的99个数字。本质上它不是随机的Java MersenneTwister没有给出随机数?,java,random,mersenne-twister,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()); } MersenneTwister mt=new MersenneTwis
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<=99; i++ ) {
System.out.println("Next "+mt.nextDouble());
}
MersenneTwister mt=new MersenneTwister();
对于(int i=0;itl;dr):将您的new MersenneTwister()
更改为new MersenneTwister(new Date())
伪随机数生成器使用种子来确定产生的数字序列。如果未设置种子,则生成器将默认设置种子。某些生成器每次默认使用不同的种子,例如使用计算机时钟,或通过读取/dev/uradom
。其他生成器默认使用固定种子
听起来您的生成器默认使用的是固定种子(MersenneTwister()
)的文档中说“构造并返回一个带有默认种子的随机数生成器,默认种子是一个常量”“[原始强调])。当然,这将导致相同的数字流
您应该使用MersenneTwister(Date)
构造函数(只需使用new MersenneTwister(new Date())
),或者MersenneTwister(int)
构造函数(尽管这似乎不太理想,因为int
只有32位宽)。tl;dr:将new MersenneTwister()
更改为new MersenneTwister()(新日期())
伪随机数生成器使用种子来确定产生的数字序列。如果未设置种子,则生成器将默认设置种子。某些生成器每次默认使用不同的种子,例如使用计算机时钟,或通过读取/dev/uradom
。其他生成器默认使用固定种子
听起来您的生成器默认使用的是固定种子(MersenneTwister()
)的文档中说“构造并返回一个带有默认种子的随机数生成器,默认种子是一个常量”“[原始强调])。当然,这将导致相同的数字流
您应该使用MersenneTwister(Date)
构造函数(只需使用new MersenneTwister(new Date())
),或者MersenneTwister(int)
构造函数(尽管这似乎不太理想,因为int
只有32位宽).Mersenne Twister是一种从种子创建可预测、随机、均匀分布的数字的算法。在您的情况下,您需要向Twister提供一个种子,比如系统时间或更好的底层操作系统提供的随机性源
Mersenne Twister只混合了大约字节,因此您总是可以从同一种子中获得相同的结果。例如,在游戏中创建虚拟世界时,您可以使用一个小种子重新创建千兆字节的数据。这不是一种创建随机性的方法,而是一种创建随机性的方法omly从种子中分配的值(可以是随机值,也可以是日期之类的可预测值).Mersenne Twister是一种从种子创建可预测、随机、均匀分布的数字的算法。在您的情况下,您需要向Twister提供一个种子,比如系统时间或更好的底层操作系统提供的随机性源
Mersenne Twister只混合了大约字节,因此您总是可以从同一种子中获得相同的结果。例如,在游戏中创建虚拟世界时,您可以使用一个小种子重新创建千兆字节的数据。这不是一种创建随机性的方法,而是一种创建随机性的方法omly从种子中分配的值(可以是随机值,也可以是日期之类的可预测值).这不是一个标准Java类。哪个库提供了它?我猜它每次都是用相同的值播种的。这不是一个标准Java类。哪个库提供了它?我猜它每次都是用相同的值播种的。所以首先我认为MT只是用32位序列扭曲,所以是32“宽”键也很好。第二,取决于日期的“精细程度”,两个并行运行的进程可能会得到相同的数字。因此,首先,我认为MT只使用32位序列,所以32“宽”键也很好。第二,取决于“精细程度”日期是,对于并行运行的两个进程,您可能会得到相同的数字。