Scala中的随机生成器是线程安全的吗
我有以下代码:Scala中的随机生成器是线程安全的吗,scala,random,thread-safety,Scala,Random,Thread Safety,我有以下代码: import scala.util.Random val seq = Seq[Int](1, 2, 3) val rand = new Random(123) val gen = seq.par.map(_ => rand.nextInt(3)) println(gen.seq) 它打印出向量(2,2,2)。 Scala中的随机生成器似乎不是线程安全的? 这是真的吗?如果是这样的话,我如何在为不同线程使用不同种子的基础上处理它。 另外,如果我在Scala中使用Java中
import scala.util.Random
val seq = Seq[Int](1, 2, 3)
val rand = new Random(123)
val gen = seq.par.map(_ => rand.nextInt(3))
println(gen.seq)
它打印出向量(2,2,2)。
Scala中的随机生成器似乎不是线程安全的?
这是真的吗?如果是这样的话,我如何在为不同线程使用不同种子的基础上处理它。
另外,如果我在Scala中使用Java中的random类,它仍然是线程安全的吗?
相关问题
解释
par
指scala.collection.parallel.immutable
中的par
。但我的电脑似乎不需要我这么做。它在我的电脑上运行。是的。与Java中的相同。让我们来看看后面的随机发生器的实现:
基本上,我们根据下一个元素进行计算。如果种子
已经更改,它将创建一个新的下一个种子
,直到成功更新种子。因此它是线程安全的
出于同样的原因,在你的场景中,情况似乎并非如此。但是,如果我们在没有任何并行性的情况下运行相同的程序,我们将得到相同的结果
import scala.util.{Failure, Random, Success}
val seq = Seq[Int](1, 2, 3)
val rand = new Random(123)
val gen = seq.map(_ => rand.nextInt(3))
println(gen.seq)
将导致:
List(2, 2, 2)
代码在上运行。这是因为种子
123
的前三个“随机”数是2,2,2
par
应该从导入scala.collection.parallel.immutable
导入。然而,似乎我的计算机不需要我导入,增加数量,你会发现你不会得到相同的结果:@TomerShetah不太可能,因为它不能回答线程安全与否的问题。我记得这个问题已经问过了,但我可能错了。@TomerShetah我会把我的问题标记为重复的。谢谢你指出:)对。最好使用ThreadLocalRandom
,如前所述。
List(2, 2, 2)