我是 scala 的新手,所以这可能是一个愚蠢的问题。我知道你做nextInt(seed)
时它会使用种子,但是当你创建对象时,它的种子是什么?例如,在这行代码中:
val rnd = new scala.util.Random(1000)
当您继续使用rnd.nextInt(100)
或类似内容时,这似乎对数字的结果没有影响。
答案 0 :(得分:13)
调用nextInt(n)
时,n
不是种子,它是返回的伪随机数的上限(0到n之前)。
当创建 Random
的实例时,您传递的数字是种子。它确实对结果有影响:
val r1 = new scala.util.Random(1)
r1.nextInt(1000) // -> 985
val r2 = new scala.util.Random(2)
r2.nextInt(1000) // -> 108 - different seed than `r1`
val r3 = new scala.util.Random(1)
r3.nextInt(1000) // -> 985 - because seeded just as `r1`
种子永远不会在返回的数字中直接观察到(除了它们遵循不同的序列),因为a)它在内部进一步加扰,b)生成的数字在种子上使用多个按位运算的组合。
通常,您将为种子使用任意固定数字,以确保生成的序列可重现,或者您使用其他伪随机数,例如当前计算机时钟(例如System.currentTimeMillis
)