私の目標はparMap
、parallel パッケージを使用して計算を並列化することですが、サンプリング関数にランダム性を少し追加したいと思います。
ランダム性がなければ、私の計算は単純に数を計算するだけなので、それは純粋であり、 を使用できますparMap
。良い結果を得るには、各ステップで複数のサンプルを取得し、結果を平均化する必要があります。サンプリングはランダム化する必要があります。
1 つの解決策は、ランダム パッケージを使用し、呼び出し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)
代わりに、並列数ジェネレーターに手を伸ばす必要がありますか? それとも、遅いランダム パッケージを使用せずに、自分のアルゴリズムが純粋ではないことを認める必要がありますか?
提案?ありがとう!