4

最初の方法でOKです。2 番目は、常に同じ数字のペアを繰り返します。

その理由は私にはまったくわかりません...良い方向を示してもらえますか?

module Normal = 
   let rnd = new MersenneTwister()
   let sampleNormal = 
      fun () -> let rec randomNormal() = let u1, u2 = rnd.NextDouble(),rnd.NextDouble()
                                         let r, theta= sqrt (-2. * (log u1)), 2. * System.Math.PI * u2  
                                         seq { yield r * sin theta; yield r * cos theta ; printfn "next";yield! randomNormal() }
                randomNormal()

   let sampleNormalBAD = 
      fun () -> let rec randomNormal = let u1, u2 = rnd.NextDouble(),rnd.NextDouble()
                                       let r, theta= sqrt (-2. * (log u1)), 2. * System.Math.PI * u2  
                                       seq { yield r * sin theta; yield r * cos theta ; printfn "next";yield! randomNormal }
                randomNormal

Normal.sampleNormal() |> Seq.take(10) |>Seq.toArray
Normal.sampleNormalBAD() |> Seq.take(10) |>Seq.toArray
4

2 に答える 2

4

最初のサンプルrandomNormal()は関数で()あり、値を取得して返します。毎回評価されます。2つ目randomNormalは値であるため、2回評価されることはなく、一度制限されると同じ値のままになります。

ロールオーバーした場合randomNormal()、署名は次のようになります。

unit->seq<float>

そしてのためrandomNormalにちょうど:

seq<float>

更新:printfnはシーケンス内にあるため、出力を継続します。これは、制限された値です。最後の行の前に本文を印刷しようとすると、違いがわかります。簡略化したサンプルコードは次のとおりです。

let sampleNormal = 
    fun () -> 
        let rec randomNormal() = 
            let u1, u2 = 1,2
            printfn "Evaluating"
            seq { yield u1; yield u2 ; printfn "next";yield! randomNormal() }
        randomNormal()

let sampleNormalBAD = 
    fun () -> 
        let rec randomNormal = 
            let u1, u2 = 1,2 
            printfn "Evaluating"
            seq { yield u1; yield u2 ; printfn "next";yield! randomNormal }
        randomNormal
于 2012-07-01T20:32:16.290 に答える
0

グスタボの答えを完成randomNormalさせることは値であり、インタープリターによって計算された後、シーケンスにバインドされます。

をさらに呼び出すとrandomNormal、このシーケンスが生成され、シーケンスの前に使用されたバインディングを評価する理由はありません。t、シータなどは常に同じ値になります。ただし、シーケンスにあるものは評価されるため、印刷されます。

同じことが発生した場合でも、 randomNormal()関数が副作用に依存している可能性があるため、バインディングが評価されます。

于 2012-10-13T10:08:36.190 に答える