Scala 随机数生成器:创建随机数对象时种子的作用是什么?

10

我对scala还比较新,所以这可能是个愚蠢的问题。我知道当你使用nextInt(seed)时它会使用种子,但在创建对象时,种子是什么呢?例如,在这行代码中:

val rnd = new scala.util.Random(1000)

当您继续使用rnd.nextInt(100)或类似方法时,这似乎对数字的结果没有影响。

1个回答

21
当调用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)。


2
我还想提到 Java/Scala 中的两种随机类型 -- 安全的不安全的。这些页面还包含有关种子和一些相关信息的说明。 - om-nom-nom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接