我的目标是使用并行包parMap
并行计算,但我还想为我的采样函数添加一些随机性。
如果没有随机性,我的计算只是一些数字运算,所以它是纯粹的,我可以使用parMap
. 为了得到好的结果,我需要在每一步都取多个样本并对结果进行平均。抽样需要随机化。
一种解决方案可能是使用random 包,调用randoms
然后在计算期间使用该列表(通过将纯惰性列表传递给计算,我将保持它的纯净)。不幸的是,这是一个非常慢的随机数生成器,我需要很多随机数,所以我更喜欢使用mwc-random或mersenne-random(尽管我不认为 mersenne-random 仍然保持不变)。
unsafePerformIO
使用mwc-random 之类的东西来编写类似的函数是否安全randoms
?像这样的东西:
randomsMWC :: Variate a => GenST s -> [a]
randomsMWC g = unsafePerformIO $ unsafeSTToIO $ randomsMWC' g
where
randomsMWC' g = do
a <- uniform g
as <- unsafeInterleaveST $ randomsMWC' g
return (a : as)
我是否需要转而使用并行数字生成器?或者我是否需要硬着头皮承认如果不使用慢速随机包我的算法根本不纯?
建议?谢谢!