簡體   English   中英

F#中的閉包和隨機數

[英]Closures and random numbers in F#

為了好玩,我試圖用F#編寫一個簡單的Monty Hall問題模擬。

我創建了一個函數getShow ,該函數返回一個由三個布爾值組成的數組(代表門),其中一個布爾值為true(它后面有輛汽車),而另外兩個為false。

let getShow = 
    let doorWithCar = System.Random().Next(3)+1
    [|for door in 1..3 -> door = doorWithCar|]

現在,當我嘗試使用yield來調用getShow函數來獲取一系列節目時,我不斷重復第一個隨機節目(我猜是因為閉包在F#中的工作方式)。

let shows = 
  seq { for i in 1 .. 10 do yield getShow} // Keeps generating the same show over and over

使用yield調用getShow函數的正確方法是什么,以便它實際上調用該函數並獲取新的隨機數組?

getShow是一個值,而不是一個函數,所以它只計算一次,你就會繼續產生相同的值。 要將其轉換為函數,您必須添加() 此外,您繼續創建一個新的Random實例,該實例可能使用相同的時間種子進行初始化,而不是為您提供所需的內容。 試試這個:

let random = System.Random()
let getShow() = 
    let doorWithCar = random.Next(3)+1
    [|for door in 1..3 -> door = doorWithCar|]
let shows = 
   seq { for i in 1 .. 10 do yield getShow()}

暫無
暫無

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

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