Параллельная генерация случайных чисел с Akka Futures - PullRequest
6 голосов
/ 07 марта 2012

Я пишу приложение с интенсивным использованием процессора, созданное с помощью Akka 2 Futures.В настоящее время мне не нужны актеры, но я не хочу их использовать.

Несколько вычислений, заключенных в фьючерсы, должны вызывать генератор случайных чисел, очень часто.Я боюсь, что если я использую классический параллельный RNG, он станет удушающей точкой, и я потеряю масштабируемость.

Какой самый быстрый / простой способ иметь генератор случайных чисел на поток в ExecutionContext?

Есть ли способ инициализировать их всех другим семенем (но заранее известным), например, повторить эксперимент?

Ответы [ 3 ]

4 голосов
/ 07 марта 2012

Если использование ThreadLocalRandom не вариант, вы можете довольно легко написать свой собственный, используя ThreadLocal и Scala's Random. Хотя предоставление «дополнительных обычно используемых методов генерации случайных чисел» - это упражнение, оставленное заинтересованному разработчику.

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

  def current = localRandom.get
}
4 голосов
/ 08 марта 2012

Использовать akka.jsr166y.ThreadLocalRandom

2 голосов
/ 07 марта 2012

Не используйте генератор случайных чисел Scala; это просто обертка вокруг Javas, которую вы, вероятно, заметили, синхронизируется.

Java 7 имеет ThreadLocalRandom, созданный для вашего использования. Если вы не можете использовать Java 7, используйте другой рандомизатор; например отсюда несинхронизированная реализация твистера Mersenna: http://www.cs.gmu.edu/~sean/research/. Используйте эту реализацию через объект ThreadLocal, чтобы у каждого потока был тот, который инициализируется только один раз. Для заполнения экземпляров просто используйте общий обычный синхронизированный случайный случай.

...