如何从递归随机游走函数中的序列返回特定数量的值?

时间:2015-11-09 01:48:38

标签: f#

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

您的randomWalk函数产生无限序列,因此您不应在未使用Seq.take来限制项目数量的情况下调用它,例如,您尝试绘制的100个项目。如果你直接调用它,应用程序会冻结,因为你永远不会找到无限序列的结束。但是,如果您对somePrice |> this.RW |> Seq.take 100进行图表制作,则不应再让您的应用程序冻结。

得到一个无限序列的计数也会冻结,因为它将通过序列试图到达终点所以它可以返回一个计数,但是没有结束!你永远不能计算无限的序列。

更新:还有Seq.truncateSeq.takeSeq.truncate之间的区别在于如果项目少于预期会发生什么。 (这不是您的randomWalk功能的情况,因此您可以使用taketruncate,但您可以,但在其他情况下,您可能会需要知道区别。)如果一个序列只有5个项目,但你尝试从它Seq.take 10,它将抛出异常。另一方面,Seq.truncate只会返回5个项目。

因此Seq.take 10将返回10个项目,不多或少,或者抛出异常。 Seq.truncate 10将返回最多 10个项目,但可能会返回更少的项目,并且永远不会抛出异常。

有关详细信息,请参阅Does F# have an equivalent to Haskell's take?