我正在尝试基于 Haskell 中的 Metropolis 算法编写一个 MCMC 程序,但我在从概率分布(生成伪随机数)采样和构建程序时遇到问题。现在我很高兴使用带有硬编码种子的生成器,而不是处理处理 IO 的复杂性。
看来我应该使用 state monad 来跟踪随机生成器状态、之前的马尔可夫链状态、卡方值和算法每一步之间的接受计数,然后最后收集所有马尔可夫链状态和最后一次接受数数。这是最好的/惯用的方法吗?如果是这样,程序的布局应该是什么(即提案功能和大都会阶梯功能的类型签名等)。
我见过一些处理随机数的示例程序,其中特定长度的随机数列表是从某种概率单子生成的,然后通过一些简单的函数进行线程化以执行计算。如果可能的话,我真的很想避免这种由内而外的程序形式。
编辑:暂时删除 WIP 代码。