随机种子之间的区别是否重要?

时间:2016-01-20 19:25:22

标签: java random

请问:

new java.util.Random(/* random seed */ 0)
new java.util.Random(/* random seed */ 1)

以某种方式导致"随机性减少" /"更相似"随机生成器比这个?

new java.util.Random(/* random seed */ 0)
new java.util.Random(/* random seed */ 1000)

换句话说:如果他们的随机种子相似,我是否有可能从随机生成器获得类似的一系列整数?

3 个答案:

答案 0 :(得分:4)

不,类似的种子不会产生类似的随机数 只有相同的种子会产生相同的数字。

设置种子的代码是:

void setSeed(long seed) {
    this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);
..}

此公式避免this.seed获取输入种子值的相似值(在构造函数中使用,或通过setSeed()。

然而,有一些弱点,als解释说 http://dontpanic.42.nl/2011/03/when-random-isn-as-random-as-expected.html

答案 1 :(得分:1)

用于生成伪随机数的状态更新是chaotic。因此,使用相邻的种子值会导致完全不同的状态轨迹。

答案 2 :(得分:0)

随机数永远不会随机。它们是完全预定义的,并且给定相同的种子将始终产生相同的数字,甚至超过一百万次不同的命令运行,这就是它们被称为"Pseudorandom"的原因。最好的方法是使用每次运行程序时不同的值进行种子处理,并且无法轻松预测,例如当前时间和日期和/或已经过的时钟周期数。