2012-03-07 4 views
6

Я пишу приложение с интенсивным использованием процессора, созданное с использованием флагов Akka 2. Мне сейчас не нужны актеры, но я не хочу их использовать.Генерация параллельных случайных чисел с использованием фьючерсов Akka

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

Что является самым быстрым/простым способом создания генератора случайных чисел в потоке в ExecutionContext?

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

ответ

4

Использование akka.jsr166y.ThreadLocalRandom

2

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

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

4

Если вы не используете 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 
} 
Смежные вопросы