我想编写以下Haskell函数,它将为我提供唯一的随机生成器列表:
randomGenerators :: RandomGen g => g -> [g]
以下解决方案是否是一个合理的解决方案,不会造成重复"相同"序列的情况?
randomGenerators g = iterate (fst . split) g
我显然扔掉了所有发电机的一半,但这会是一个问题吗?
这将起作用,前提是正确实现split
(也就是说,如果它产生不相关的生成器)。System.Random
被认为是健壮的(尽管它的split
实现包含注释-- no statistical foundation for this!
,因此使用它需要您自担风险并测试相关性)。
或者,您可以使用专门设计用于并行批次的 RNG。例如,我有一个实现基于计数器的生成器的包Random123
(目前针对性能没有很好的优化,但可能适合您的目的)。那里可能还有 DCMT 库的绑定,或者您可以编写自己的绑定。