В проблеме моделирования мне нужно создать тысячи объектов-агентов, которые ведут себя независимо друг от друга. Для этого мне нужно передать каждому из этих агентов другой генератор случайных чисел. Как это сделать в Haskell? На языке, таком как C, я могу просто генерировать случайное число всякий раз, когда это необходимо, но в Haskell мне нужно сделать это только в монаде IO. Поведение агентов в полностью чистом вычислении.Haskell как генерировать бесконечное количество списков бесконечных случайных чисел для моделирования?
Я делаю это следующим образом в настоящее время:
import System.Random
main = do
gen1 <- newStdGen
let rands1 = randoms gen :: [Int]
gen2 <- newStdGen
let rands2 = randoms gen :: [Int]
let sout = map (agentRun extraArgs) [rands1,rands2]
writeFile "output" $ unlines sout
agentRun = <<some pure code that uses random numbers>>
Один способ, которым я мог бы решить эту проблему, приводится ниже, но страдает от того, что требуется для запуска только, и я в IO монаде не может просто отобразить функцию в списке. Есть ли лучший и более похожий на Haskell способ сделать это? Если да, укажите пример кода.
Обратите внимание, что агенты требуют доступа к бесконечному списку, поскольку заранее не известно, сколько случайных чисел необходимо.
import System.Random
main = do
dorun 10
dorun 0 = return()
dorun n = do
gen1 <- newStdGen
let rands1 = randoms gen :: [Int]
let sout = agentRun extraArgs rands1
appendFile "output" sout
dorun (n-1)
agentRun = <<some pure code that uses random numbers>>
Ваш путь совершенно прав - ваша функция принимает бесконечный список в качестве аргумента и фактически генерирует список в 'main'. Кроме того, бесконечный список 'Int' и бесконечный список бесконечных списков' Int' содержат одинаковое количество элементов. Вы продемонстрировали, что у вас нет бесконечного числа агентов, поэтому почему бы не иметь конечное число случайных списков: 'map (agentRun args. Randoms) <$> replicateM numRuns newStdGen'. Наконец, если вы имеете дело со случайностью, вы можете воспользоваться [некоторой абстракцией] (https://hackage.haskell.org/package/MonadRandom-0.4.2.3). – user2407038
'Data.List.unfoldr (Just. Split) :: RandomGen b => b -> [b]' дает вам бесконечный список генераторов, учитывая один. Если ваша функция имеет такое ограничение, она может использовать бесконечные списки бесконечных списков 'Int'. Я не знаю, так ли это иррационально. – Michael
Обратите внимание, что 'System.Random' - очень плохой генератор и может привести к плохой работе вашей программы. Рассмотрите возможность использования одного из других генераторов, таких как 'System.Random.TF' из tf-random. –