[英]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.initInfinite和Seq.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.