2

为了好玩,我正在尝试 使用 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函数的正确方法是什么,以便它实际调用该函数并获取一个新的随机数组?

4

1 回答 1

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()}
于 2013-10-25T14:15:51.183 回答