F#中的闭包和随机数

时间:2013-10-25 13:10:14

标签: random f# closures

为了好玩,我正在尝试编写一个简单的模拟 Monty Hall problem  使用F#的问题。

我创建了一个函数 getShow ,它返回一个包含三个布尔值(代表门)的数组,其中一个是随机的(它背后有一辆车),另外两个是假的。

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 函数的正确方法是什么,以便它实际调用函数并获取一个新的随机数组?

1 个答案:

答案 0 :(得分:7)

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()}