2013-10-25 71 views
2

为了好玩,我试图用F#编写一个简单的模拟 Monty Hall problem 问题。F中的闭包和随机数#

我已经创建了一个函数getShow返回三个布尔值(代表门),其中一个是真正随机的阵列(它有一个车它后面)和其它两个假。

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

现在,当我尝试使用产量调用getShow函数来获取节目的顺序,我不断收到第一随机显示重复(我猜的,因为封闭在F#中的工作方式) 。

let shows = 
    seq { for i in 1 .. 10 do yield getShow} // Keeps generating the same show over and over 

什么是调用正确的方式getShow使用产量因此,它实际上调用该函数,并得到一个新的随机阵列功能?

回答

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

完美,谢谢! – Russell