Chỉ cần mở rộng về câu trả lời dflemstr, bạn có thể tạo ra một danh sách vô hạn các giá trị gia quyền sử dụng Control.Monad.Random như thế này:
import Control.Monad.Random
import System.Random
weightedList :: RandomGen g => g -> [(a, Rational)] -> [a]
weightedList gen weights = evalRand m gen
where m = sequence . repeat . fromList $ weights
Và sử dụng nó như thế này:
> let values = weightedList (mkStdGen 123) [(1, 2), (2, 5), (3, 10)]
> take 20 values
[2,1,3,2,1,2,2,3,3,3,3,3,3,2,3,3,2,2,2,3]
này không yêu cầu đơn nguyên IO, nhưng bạn cần phải cung cấp trình tạo số ngẫu nhiên được sử dụng cho luồng.
Tôi chỉ cố gắng này "Tổng thời gian 55.59s" chống lại việc thực hiện ở đây: http://idontgetoutmuch.wordpress.com/2014/08/26/haskell-vectors-and-sampling-from-a-categorical phân phối/"Tổng thời gian 11,09" lấy mẫu 2 * 10^7 mẫu trong cả hai trường hợp. Có lẽ đây không phải là một sự so sánh công bằng khi sử dụng System.Random và System.Random.MWC khác. – idontgetoutmuch
Có, tôi cho rằng việc tạo các số ngẫu nhiên sẽ chiếm ưu thế trong mã của tôi. Nó cũng cần chuyên môn hóa, có thể xảy ra tự động với -O2. – augustss
Sử dụng trình tạo số ngẫu nhiên khác, tôi nhận được "Tổng thời gian 20,31 giây" tốt hơn nhưng vẫn không tốt. Tôi chưa thử chuyên môn. Việc sử dụng bộ nhớ cũng không tốt. Tôi sẽ mong đợi 4 + 8 byte cho mỗi mục trong hai bảng vì vậy mà nên được 2 * 12 * 10^7 byte vì vậy ít hơn 1G. Tôi thấy khoảng 5G. Tôi có lẽ là ngây thơ mặc dù. Và tôi vẫn chưa đọc xong Devroye và Vose. Ai có thể nghĩ rằng bạn có thể có rất nhiều niềm vui với số ngẫu nhiên. – idontgetoutmuch