2012-03-07 3 views
6

저는 Akka 2 Futures로 작성된 CPU 집약적 인 응용 프로그램을 작성하고 있습니다. 나는 현재 배우가 필요 없지만 그들을 사용하는 것을 꺼려하지 않는다.Akka Futures를 사용한 병렬 난수 생성

미래에 포함 된 여러 계산은 매우 자주 임의 생성기를 호출해야합니다. 클래식 동시 RNG를 사용하면 질식하게되고 확장 성이 떨어질 까봐 걱정됩니다.

ExecutionContext에서 스레드 당 임의 생성기를 갖는 가장 빠르고 간단한 방법은 무엇입니까?

실험을 반복하는 것과 같은 다른 시드 (사전에 알려져 있음)로 모두 초기화 할 수있는 방법이 있습니까?

답변

4

사용 akka.jsr166y.ThreadLocalRandom

2

스칼라 랜덤 생성기를 사용하지 마십시오. Javas를 둘러싼 랩퍼 일뿐입니다.

자바 7에는 사용하기 위해 만들어진 ThreadLocalRandom이 있습니다. 자바 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 
}