为了好玩,我正在尝试编写一个简单的模拟 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 函数的正确方法是什么,以便它实际调用函数并获取一个新的随机数组?
答案 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()}