私はscalaにかなり慣れていないので、これはばかげた質問かもしれません。シードを使用するときは知っていnextInt(seed)
ますが、オブジェクトを作成するとき、シードは何のためにあるのでしょうか? たとえば、次のコード行で:
val rnd = new scala.util.Random(1000)
これは、使用を続ける場合などの数値の結果に影響を与えないrnd.nextInt(100)
ようです。
私はscalaにかなり慣れていないので、これはばかげた質問かもしれません。シードを使用するときは知っていnextInt(seed)
ますが、オブジェクトを作成するとき、シードは何のためにあるのでしょうか? たとえば、次のコード行で:
val rnd = new scala.util.Random(1000)
これは、使用を続ける場合などの数値の結果に影響を与えないrnd.nextInt(100)
ようです。
を呼び出した場合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
たとえば)。