gpt4 book ai didi

f# - 由 Sequence 的前一个元素和另一个 Sequence 构造的 Sequence

转载 作者:行者123 更新时间:2023-11-30 23:55:19 27 4
gpt4 key购买 nike

出于学习目的,我正在尝试使用 F# 以序列形式运行模拟。从一系列随机数开始,如果状态不依赖于先前的状态,map 是生成状态序列的直接方法。我遇到问题的地方是当我尝试做类似的事情时:
State(i+1) = F (State(i), 随机数)
我设法通过使用 unfold 来实现一些工作,按照

的方式传入随机生成器
  let unfold (day:State,rnd:Random) =
let rand = rnd.NextDouble()
let nextDay = NextState day rand
Some (nextDay, (nextDay, rnd))

但是,至少在我没有经验的人看来,关于传递 Random 实例的某些事情似乎很可疑。有没有一种方法可以实现类似的东西,但传递的是随机数序列,而不是生成器?

最佳答案

我认为您关于传递 Random 实例的直觉是可疑的:当可变状态有用时,最好将其隔离,这样您就可以尽可能地从纯度中受益。

我们可以通过创建一个序列来隔离这里的状态,该序列在每次迭代时产生一组不同的随机数

open System
let rndSeq =
seq {
//note that by putting rnd inside seq expression here, we ensure that each iteration of the sequence
//yields a different sequnce of random numbers
let rnd = new Random()
while true do yield rnd.NextDouble()
}

然后,您可以使用 Seq.scan 来迭代随机序列,方法是使用一个函数映射元素,该函数由被映射的前一个元素通知。

let runSimulation inputSeq initialState =
inputSeq
|> Seq.scan
(fun (previousState:State) (inputElement:float) -> NextState previousState inputElement)
initialState

runSimulation rndSeq initialState //run the simulation using a random sequence of doubles greater than or equal to 0.0 and less than 1

您可以在这里看到一个额外的好处,即您的模拟输入和模拟实现不再绑定(bind)在一起,您可以使用任何输入序列运行​​您的模拟。

关于f# - 由 Sequence 的前一个元素和另一个 Sequence 构造的 Sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615184/

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