2012-03-07 36 views
6

Tôi đang viết một ứng dụng chuyên sâu CPU được xây dựng với Akka 2 Futures. Hiện tại tôi không cần các diễn viên nhưng tôi không miễn cưỡng sử dụng chúng.Tạo số ngẫu nhiên song song với Akka Futures

Một số tính toán kèm theo trong tương lai phải gọi một trình tạo ngẫu nhiên, rất thường xuyên. Tôi sợ rằng nếu tôi sử dụng một RNG đồng thời cổ điển, nó sẽ trở thành một điểm nghẹt thở và tôi sẽ mất khả năng mở rộng.

Cách nhanh nhất/đơn giản nhất để có Trình tạo ngẫu nhiên cho mỗi chuỗi trong ExecutionContext là gì?

Có cách nào để khởi tạo tất cả bằng hạt giống khác (nhưng đã biết trước) như vậy để lặp lại thử nghiệm không?

Trả lời

4

Sử dụng akka.jsr166y.ThreadLocalRandom

2

Không sử dụng trình tạo ngẫu nhiên Scala; nó chỉ là một wrapper xung quanh Javas mà bạn có thể nhận thấy được đồng bộ hóa.

Java 7 có ThreadLocalRandom được tạo để bạn sử dụng. Nếu bạn không thể sử dụng java 7, hãy sử dụng một trình ngẫu nhiên khác; ví dụ: việc thực hiện twister không đồng bộ hóa từ đây: http://www.cs.gmu.edu/~sean/research/. Sử dụng thực hiện này thông qua một đối tượng ThreadLocal để mỗi thread có một thats chỉ được khởi tạo một lần. Để hạt giống các trường hợp, chỉ cần sử dụng Random random được chia sẻ bình thường.

4

Nếu sử dụng ThreadLocalRandom không phải là một tùy chọn, bạn có thể dễ dàng viết riêng của mình bằng cách sử dụng ThreadLocal và Scala's Random. Mặc dù việc cung cấp "phương pháp tạo ngẫu nhiên bị ràng buộc thường được sử dụng bổ sung" là một bài tập được để lại cho nhà phát triển quan tâm.

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

    def current = localRandom.get 
}