gpt4 book ai didi

随机生成到 fsharp 列表中

转载 作者:行者123 更新时间:2023-12-02 23:31:51 27 4
gpt4 key购买 nike

我正在尝试使用 F# 生成随机三元组列表 -> 两个随机数及其总和:

let foo minNum maxNum = 
let rnd = System.Random()
let first = rnd.Next(minNum, maxNum)
let second = rnd.Next(minNum, maxNum)
let third = first + second
first, second, third

可以像这样调用并且运行良好(总是给出一个新的随机数)(使用 F# 交互时)

foo 0 50

当尝试生成这样的随机三元组列表时

List.init 100 (fun index -> foo 0 50)

我希望这是一个包含 100 个随机三元组的列表,但它们都具有相同的值。我可以看到该函数不依赖于索引,因此不需要重新计算,但我不确定如何解决它(我尝试将索引引入为未使用的虚拟变量,也尝试将索引引入为随机种子,但都没有帮助)

最佳答案

您假设代码无法按您希望的方式工作的原因是编译器错误地应用了某种常见的子表达式消除,这导致仅对 foo 0 50 进行求值一次。不是这种情况。编译器非常清楚函数可能是不纯的,并且不会执行会因不纯代码而破坏的优化(除非可以证明正在优化的特定代码是纯的)。因此,您不必担心让编译器认为您正在使用该参数。

问题不在于 foo 0 50 仅被调用一次 - 它确实像您想要的那样被调用了 100 次。问题是它被调用 100 次时每次都返回相同的值。

但是当您手动测试时它返回不同的值时为什么会这样做呢?

因为每次调用 foo 时都会创建一个新的 Random 对象。由于您没有为该随机对象提供种子值,因此它将使用当前系统时间作为种子。因此,如果多次调用该函数并中间经过一段时间,则每次都会返回不同的值。但是,如果您在如此短的时间内调用它 100 次,并且系统时间在这期间没有改变,那么您将返回相同的值 100 次。

因此,问题的解决方案是重用相同的随机对象,而不是每次调用 foo 时创建一个新对象。

关于随机生成到 fsharp 列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7051531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com