F# 随机数生成

F# 随机数生成,f#,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类上调用一个静态方法,但如

我有以下代码:

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类上调用一个静态方法,但如果它能够编译,我会感到惊讶,因为NextDouble实际上并不是声明为静态的。

您的两个代码示例并不等价。第一个函数创建一个对象,然后在该对象上重复调用NextDouble。第二种方法似乎在Random类上调用了一个静态方法,但如果它能够编译,我会感到惊讶,因为NextDouble实际上并没有声明为静态的。

如果需要,您可以通过几种方式组合创建Random实例和使用它:

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


如果需要,可以通过两种方式将随机实例的创建和使用结合起来:

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


大多数由计算机生成的随机数,比如你的代码,并不是真正意义上的随机数。它们是由一个算法生成的,并且给定了算法和种子,就像是算法的起点,确定性的

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

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

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

Let rand = System.Random()
您正在初始化随机数生成器。这就像你在写一本充满随机数的书。然后,要从序列中迭代抽取随机数,需要

rand.NextDouble()
这就像从丛书中挑选第一个数字一样。再打一次,然后从序列中选择第二个号码,等等

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

let rand = System.Random(1)
或者,如果你想要一系列不同的随机数呢

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

大多数由计算机生成的随机数,比如你的代码,并不是真正意义上的随机数。它们是由一个算法生成的,并且给定了算法和种子,就像是算法的起点,确定性的

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

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

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

Let rand = System.Random()
您正在初始化随机数生成器。这就像你在写一本充满随机数的书。然后,要从序列中迭代抽取随机数,需要

rand.NextDouble()
这就像从丛书中挑选第一个数字一样。再打一次,然后从序列中选择第二个号码,等等

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

let rand = System.Random(1)
或者,如果你想要一系列不同的随机数呢

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

因为你需要创建一个随机对象,你可以做System.random.NextDouble,但是你每次都会得到相同的答案time@JohnPalmer你可能每次都会得到相同的答案。它保持不变,除非用于种子设定的粗粒度时间发生变化。一般来说,自动播种不好依靠;它既不具有充分的不确定性,也不具有确定性。生成随机结构的组合器:因为你需要创建一个随机对象-你可以做System.random.NextDouble,但你每次都会得到相同的答案time@JohnPalmer你可能每次都会得到相同的答案。它保持不变,除非用于种子设定的粗粒度时间发生变化。一般来说,自动播种不好依靠;它既不具有充分的不确定性,也不具有确定性。生成随机结构的组合器:这是非常危险的。尝试按顺序生成三个相同的定义gold1 gold2和gold3:.NET的当前实现可能会产生至少两个相同的结果
s我不建议使用多个System.Random实例,因为初学者在播种时会遇到困难,而需要多个实例的线程程序应该能提供更好的解决方案。系统。随机有一些。这是微妙的危险。尝试按顺序创建三个相同的定义gold1 gold2和gold3:.NET的当前实现可能会产生至少两个相同的结果。我不建议使用多个System.Random实例,因为初学者在播种时会遇到困难,而需要多个实例的线程程序应该能提供更好的解决方案。系统。随机有一些。