gpt4 book ai didi

Haskell如何为模拟生成无限数量的无限随机数列表?

转载 作者:行者123 更新时间:2023-12-02 01:21:15 27 4
gpt4 key购买 nike

在模拟问题中,我需要生成数千个彼此独立行为的代理对象。为此,我需要为每个代理传递一个不同的随机数生成器。如何在 Haskell 中做到这一点?
在像 C 这样的语言中,我可以在需要时生成一个随机数,但在 Haskell 中,我只需要在 IO monad 中生成它。代理在完全纯计算中的行为。

我现在按以下方式进行:

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 monad 中运行,我不能只将函数映射到列表上。有没有更好的,更像 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>>

最佳答案

大概你有一些包含代理参数的结构和一个函数

agentRun :: AgentParams -> [Int] -> Agent

你的问题是,你如何为每个代理创建一个无限的 Int 列表。

大概你从一个 AgentParams 列表开始,你想映射 agentRun在它上面,像这样:
agentsParams :: [AgentParams]
agents = map (\p -> agentRun p ????) agentParams

问题是,您看不到如何将不同的无限列表放入每个代理中。

为此,您可以使用库函数 unfoldrsplit :
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
split :: (RandomGen g) => g -> (g,g)
unfoldr继续应用它的函数直到它返回 Nothing .
split接受一个随机生成器并返回两个新生成器。所以 Just . splitunfoldr 做了一个很好的论证.
infiniteGenerators :: (RandomGen g) => g -> [g]
infiniteGenerators = unfoldr (Just . split)

您现在可以将这个无限的生成器列表映射到无限列表的无限列表中:
infiniteRandomLists :: (RandomGen g) => g -> [[Int]]
infininteRandomLists = map randoms . infiniteGenerators

然后你可以使用 zipWith 来获取你的代理列表:
agents gen = zipWith agentRun (infiniteRandomLists gen)

然而,在对代理进行编码时,您可能会发现使用生成器比使用无限的 Int 列表更容易。这是因为此类函数中有一个常见模式,您可以在其中编写:
(gen2, gen3) = split gen1
result = foo gen2

这使您不必将更新的生成器传回 foo .如果您从无限列表中获取数字,那么您将必须执行以下操作:
(randomList2, result) = foo randomList1

但是更好的解决方案是使用某种随机状态 monad 来为您管理所有这些。

关于Haskell如何为模拟生成无限数量的无限随机数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40115925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com