6

我正在编写一个使用 Akka 2 Futures 构建的 CPU 密集型应用程序。我目前不需要演员,但我并不不愿意使用它们。

包含在期货中的一些计算必须经常调用随机生成器。我担心如果我使用经典的并发 RNG,它会成为一个瓶颈,我会失去可扩展性。

中每个线程都有一个随机生成器的最快速/最简单的方法是ExecutionContext什么?

有没有办法用不同的种子(但事先知道)初始化它们,比如重复实验?

4

3 回答 3

4

如果 usingThreadLocalRandom不是一个选项,您可以很容易地编写自己的 usingThreadLocal和 Scala 的Random. 尽管提供“其他常用的有界随机生成方法”是留给感兴趣的开发人员的练习。

object ThreadLocalRandom {
  private val localRandom = new ThreadLocal[util.Random] {
    override protected def initialValue() = new util.Random
  }

  def current = localRandom.get
}
于 2012-03-07T15:18:40.310 回答
4

使用 akka.jsr166y.ThreadLocalRandom

于 2012-03-08T01:09:58.773 回答
2

不要使用 Scala 随机生成器;它只是 Java 的一个包装器,您可能已经注意到它是同步的。

Java 7 有一个 ThreadLocalRandom 供您使用。如果您不能使用 java 7,请使用另一个随机发生器;例如这里的非同步 mersenna twister 实现:http ://www.cs.gmu.edu/~sean/research/ 。通过 ThreadLocal 对象使用此实现,以便每个线程都有一个只初始化一次的线程。要为实例播种,只需使用共享的正常同步 Random。

于 2012-03-07T12:13:08.010 回答