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