我在寫一個使用Akka 2期貨構建的CPU密集型應用程序。目前我不需要演員,但我不願意使用它們。Akka期貨並行隨機數生成
期貨中包含的幾個計算必須經常調用一個隨機生成器。我擔心,如果我使用經典的併發RNG,它將成爲一個窒息點,我將失去可擴展性。
什麼是在ExecutionContext
每個線程有一個隨機生成器的最快/最簡單的方法?
有沒有辦法用不同的種子初始化它們(但事先已知)這樣的重複實驗?
我在寫一個使用Akka 2期貨構建的CPU密集型應用程序。目前我不需要演員,但我不願意使用它們。Akka期貨並行隨機數生成
期貨中包含的幾個計算必須經常調用一個隨機生成器。我擔心,如果我使用經典的併發RNG,它將成爲一個窒息點,我將失去可擴展性。
什麼是在ExecutionContext
每個線程有一個隨機生成器的最快/最簡單的方法?
有沒有辦法用不同的種子初始化它們(但事先已知)這樣的重複實驗?
使用akka.jsr166y.ThreadLocalRandom
不要使用Scala隨機生成器;它只是一個你可能注意到的同步的Java包裝器。
Java 7有一個ThreadLocalRandom供您使用。如果你不能使用java 7使用另一個隨機數發生器;例如來自這裏的非同步的mersenna扭曲器實現:http://www.cs.gmu.edu/~sean/research/。通過一個ThreadLocal對象使用這個實現,以便每個線程有一個只能初始化一次。要爲實例播種,只需使用共享的普通同步隨機播放器。
如果使用ThreadLocalRandom
不是一個選項,你可以很容易地使用ThreadLocal
和斯卡拉的Random
編寫自己的。雖然提供「額外的常用有界隨機生成方法」是一個練習留給感興趣的開發人員。
object ThreadLocalRandom {
private val localRandom = new ThreadLocal[util.Random] {
override protected def initialValue() = new util.Random
}
def current = localRandom.get
}