Моя цель - распараллелить вычисление с помощью parMap
из параллельного пакета, но я также хотел бы добавить немного случайности к моей функции выборки.
Без случайности мой расчет - это просто некоторое количество хрустов, и поэтому оно чистое, и я мог бы использовать parMap
. Чтобы получить хорошие результаты, мне нужно взять несколько образцов на каждом шаге и усреднить результаты. Выборка должна быть рандомизирована.
Одним из решений может быть использование случайного пакета, вызов 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)
Нужно ли вместо этого использовать генератор параллельных чисел? Или мне нужно укусить пулю и признать, что мой алгоритм просто не чист, не используя медленный случайный пакет?
Предложения? Спасибо!