2012-03-07 2 views
6

私はAkka 2 Futuresで構築されたCPU集約型アプリケーションを作成しています。私は現在、俳優は必要ありませんが、私はそれらを使用することを躊躇していません。Akka Futuresによる並列乱数生成

未来に囲まれたいくつかの計算では、非常に頻繁にランダムジェネレータを呼び出す必要があります。私は古典的な並行RNGを使用すると、それが窒息状態になり、スケーラビリティを失うことになるのではないかと心配しています。

ExecutionContextのスレッドごとにランダムジェネレータを使用する最も簡単で簡単な方法は何ですか?

実験を繰り返すために、別のシードですべてを初期化する方法はありますか(事前にはわかっていますか)。

答えて

4

使用akka.jsr166y.ThreadLocalRandom

2

Scalaランダムジェネレータは使用しないでください。それはあなたがおそらく気付いたJavasの周りのラッパーです。

Java 7には、あなたのために作られたThreadLocalRandomがあります。 Java 7を使用できない場合は、別のランダマイザを使用してください。例えば、ここからの非同期のメルセンナ・ツイスターの実装:http://www.cs.gmu.edu/~sean/research/。この実装をThreadLocalオブジェクトから使用すると、各スレッドは一度しか初期化されないスレッドを持つことになります。インスタンスをシードするには、共有ノーマル同期ランダムを使用します。

4

ThreadLocalRandomを使用することができない場合は、ThreadLocalとScalaのRandomを使用して自分で簡単に書き込むことができます。 "一般的に使用される追加の無作為生成メソッド"を提供することは、関心のある開発者に残された課題です。

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

    def current = localRandom.get 
}