随机数生成F#

Random number generation 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()]

为什么?

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

如果需要,您可以通过多种方式组合创建 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()]

计算机生成的大多数 运行dom 数字,例如您的代码,都不是真正意义上的 运行dom。它们是由算法生成的,并且给定算法和种子(就像算法的起点)是确定性的。

本质上,当你想要一系列 运行dom 数字时,你 select 一个种子和一个算法,然后该算法开始为你生成 运行dom 数字种子作为起点并从那里迭代他的算法。

在过去,人们会生产 "random numbers" 的书籍。这些书使用种子和算法提前生成 运行dom 系列数字。如果你想要一个 运行dom 号码,那么你会 select 书中的一个。

计算机的工作原理类似。当你打电话给

Let rand = System.Random()

您正在初始化 运行dom 号码生成器。这就像您正在创作一本充满 运行dom 数字的书。然后从系列中迭代地绘制 运行dom 数字,你做

rand.NextDouble()

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

让您初始化 运行dom 号码生成器的 F#/.NET 有什么意义?好吧,如果您希望每次 运行 代码时 运行dom 系列都包含相同数字的可重复结果怎么办?好吧,这样做可以让你设置种子,这样你就可以保证运行每次都有相同的"book of random numbers":

let rand = System.Random(1)

或者,如果您想要不同系列的 运行dom 号码怎么办?

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