我的目标是使用parallel package中的
如果没有随机性,我的计算只是一些数字计算,因此它是纯的,我可以使用
一个解决方案可能是使用random package,调用
parMap
来并行计算,但我也想在我的抽样函数中添加一些随机性。如果没有随机性,我的计算只是一些数字计算,因此它是纯的,我可以使用
parMap
。为了得到好的结果,我需要在每个步骤中进行多次抽样并平均结果。抽样需要随机化。一个解决方案可能是使用random package,调用
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)
我需要使用并行数生成器吗?还是我需要咬紧牙关承认我的算法没有使用缓慢的随机包就不够纯粹?
有什么建议吗?谢谢!