我正在尝试使用F#/ Xamarin绘制此随机游走函数的前100个值。每当我调用该函数时,我的应用程序都会冻结。我试图计算这个.RW,但这也冻结了应用程序。帮助赞赏!
module SimulatingAndAnalyzingAssetPrices =
type RandomWalk(price : float) =
let sample = Normal(0.0, 1.0).Sample()
// Generate random walk from 'value' recursively
let rec randomWalk price =
seq {
yield price
yield! randomWalk (price + sample)
}
let rw = randomWalk 10.0
member this.RW = rw
注意:这是来自tryfsharp.org的财务部分。我的意图是使用Xamarin将其移植到iOS。
编辑: 尝试使用以下代码,但仍然获得无限序列:
let rw = randomWalk 10.0
let rwTake = Seq.take 100 rw
member this.RwTake = rwTake
编辑2:也尝试了
let rw = randomWalk 10.0 |> Seq.take 100
member this.RwTake = rw
答案 0 :(得分:2)
您的randomWalk
函数产生无限序列,因此您不应在未使用Seq.take
来限制项目数量的情况下调用它,例如,您尝试绘制的100个项目。如果你直接调用它,应用程序会冻结,因为你永远不会找到无限序列的结束。但是,如果您对somePrice |> this.RW |> Seq.take 100
进行图表制作,则不应再让您的应用程序冻结。
得到一个无限序列的计数也会冻结,因为它将通过序列试图到达终点所以它可以返回一个计数,但是没有结束!你永远不能计算无限的序列。
更新:还有Seq.truncate
。 Seq.take
和Seq.truncate
之间的区别在于如果项目少于预期会发生什么。 (这不是您的randomWalk
功能的情况,因此您可以使用take
或truncate
,但您可以,但在其他情况下,您可能会需要知道区别。)如果一个序列只有5个项目,但你尝试从它Seq.take 10
,它将抛出异常。另一方面,Seq.truncate
只会返回5个项目。
因此Seq.take 10
将返回10个项目,不多或少,或者抛出异常。 Seq.truncate 10
将返回最多 10个项目,但可能会返回更少的项目,并且永远不会抛出异常。