繁体   English   中英

F#中的闭包和随机数

[英]Closures and random numbers in F#

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

我创建了一个函数getShow ,该函数返回一个由三个布尔值组成的数组(代表门),其中一个布尔值为true(它后面有辆汽车),而另外两个为false。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM