簡體   English   中英

F#累加隨機數序列

[英]F# accumulating sequence of random numbers

我想創建一個數字序列,其中每個數字是它前面的所有數字加上一個隨機數的總和。

我試着這樣做:

let random = new System.Random()
let addRandom  = 
    seq{let rec stepRandom acc =          
           let step = random.Next(0,10)
               yield! acc+step     //-----wont accept this
               stepRandom (acc+step) 
        stepRandom 0 }

問題是它不會接受遞歸函數內的yield。

我可以看到一個具有可變值積累的解決方案,但是如何以慣用的方式解決這個問題呢?

使用可愛的unfold功能,采用不同的方法怎么樣:

let random = new System.Random()
let r() = random.Next(0, 10)
let s = Seq.unfold (fun acc -> Some(acc, acc+r())) (r())

展開會從初始狀態 (在本例中為第一個隨機數 - 第二個參數)和生成器函數 (第一個參數)創建一個序列,該函數采用先前的狀態並生成(1)一個新狀態(在這種情況下是前一個的總和) state加上隨機的)和(2)序列中的新元素(前一個狀態)。

如果將序列表達式與內部函數對齊,則它將成為自然的遞歸函數定義。 另外,按照你的描述,你想要產生累加器(或新的和),而不是新的隨機int。

let random = new System.Random()
let addRandom  = 
    let rec stepRandom acc = seq{          
        let step = random.Next(0,10)
        yield acc
        yield! stepRandom (acc + step) }
    stepRandom 0 

另一個選擇是使用Seq.initInfiniteSeq.scan

let rand = System.Random()
let s = Seq.initInfinite (fun _ -> rand.Next(0, 10)) 
     |> Seq.scan (+) 0
     |> Seq.skip 1
seq { let rand = System.Random()
      while true do
        yield rand.Next(0, 10) }
|> Seq.scan (+) 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM