随机数生成F#

时间:2015-04-25 02:11:52

标签: f#

我有以下代码:

let rand = System.Random()
let gold = [ for i in years do yield rand.NextDouble()]

但我无法将其折叠成一行

let gold = [ for i in years do yield System.Random.NextDouble()]

为什么呢?

3 个答案:

答案 0 :(得分:4)

您的两个代码示例并不等效。第一个创建一个对象,然后在该对象上重复调用NextDouble()。第二个似乎在static类上调用Random方法,但如果它甚至编译我会感到惊讶,因为NextDouble()实际上并未声明为static }。

答案 1 :(得分:4)

如果需要,您可以通过几种方式组合创建Random实例及其用法:

let gold =
    let rand = Random()
    [for i in 1..10 do yield rand.NextDouble()]

let gold = let rand = Random() in [for i in 1..10 do yield rand.NextDouble()]

答案 2 :(得分:1)

计算机生成的大多数随机数,例如代码,都不是真正意义上的随机数。它们由算法生成,并给出算法和种子(如算法的起点),确定性。

基本上,当你需要一系列随机数时,你选择一个种子和一个算法,然后该算法开始为你生成随机数,使用种子作为起点并从那里迭代算法。

在过去,人们会制作“随机数字”的书籍。这些书使用种子和算法提前产生随机数字序列。如果你想要一个随机数,那么你可以从书中选择一个。

计算机的工作方式类似。当你打电话

Let rand = System.Random()

您正在初始化随机数生成器。这就像你正在创作一本充满随机数的书。然后迭代地从系列中抽取随机数,你做

rand.NextDouble()

这就像从系列(书)中挑选第一个数字。再次调用它,然后从系列中选择第二个数字等。

F#/ .NET初始化随机数生成器有什么意义?那么,如果你想要每次运行代码时随机序列包含相同数字的可重复结果怎么办?好吧,这样做可以让你设置种子,这样你就可以保证拥有相同的#随书数字"每一次:

let rand = System.Random(1)

或者,如果你想要不同系列的随机数怎么办?

let rand1 = System.Random(1)
let rand2 = System.Random(2)