Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的随机生成器是线程安全的吗_Scala_Random_Thread Safety - Fatal编程技术网

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)