我将为您翻译以下内容,涉及IT技术。请注意,我将保留HTML标记并尽力使文本更加通俗易懂。
我正在尝试使用F#开发一个随机数“生成器”。
我已成功创建了以下函数:
let draw () =
let rand = new Random()
rand.Next(0,36)
这段代码可以正常运行,并生成0到36之间的一个数字。
但是,我想要创建一个可以多次运行此函数的函数。
我尝试了以下代码:
let multipleDraws (n:int) =
[for i in 1..n -> draw()]
然而,由于draw
仅在for推导式中评估一次,因此我只能得到一个结果。
如何强制执行多次draw
函数?
draw
函数体的第一行添加printfn“ draw is called”
,以查看发生了什么:你将只看到一个输出。你的draw
函数返回整数,而答案中的函数返回带有签名(unit -> int)
的匿名函数,实际上在列表推导式中被调用。这个匿名函数捕获了rand
值到闭包中,rand
本身只被种子化一次。 - Gene Belitskifun() -> rand.Next(0, 36)
中捕获rand
变量,然后返回这个新函数。因此,调用draw()
会返回一个新的函数以供以后调用。之后,当你多次调用这个匿名函数时,它使用的是单个捕获的变量rand
,而不是重新创建rand
。 - Dmitrii Lobanov