F#中的闭包和随机数

Rus*_*ell 2 random f# closures

为了好玩,我试图 用F#编写一个简单的Monty Hall问题模拟 .

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

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

现在,当我尝试使用yield来调用getShow函数来获取一系列节目时,我不断重复第一个随机节目(我猜是因为闭包在F#中的工作方式).

let shows = 
  seq { for i in 1 .. 10 do yield getShow} // Keeps generating the same show over and over
Run Code Online (Sandbox Code Playgroud)

使用yield调用getShow函数的正确方法是什么,以便它实际调用函数并获取一个新的随机数组?

Gus*_*rra 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()}
Run Code Online (Sandbox Code Playgroud)