function - F# 生成随机数时的函数简洁性

标签 function random f#

有人写下这一行是有原因的吗:

(fun max -> rndGen.Next(max))  

https://github.com/sebfia/OffLog/blob/master/Shared/Helpers.fs#L8

let NextRandom =
    let rndGen = new System.Random(int System.DateTime.Now.Ticks)
    (fun max -> rndGen.Next(max))

而不是像这样直接声明参数 max 并调用 rndGen.Next(max)

let NextRandom (max: int) =
    let rndGen = new System.Random(int System.DateTime.Now.Ticks)
    rndGen.Next(max)

最佳答案

区别在于生命周期:

  • 在第一种情况下,rndGen 仅播种一次并在之后重用,并且将在定义 NextRandom 的范围的生命周期内生存 - 如果类范围类的生命周期,或者如果是模块范围,则为 AppDomain 的生命周期。
  • 在第二个中,rndGen 将被创建 - 并播种! – 每次调用 NextRandom 时都会重新开始。

最终效果是,如果快速连续地重复调用 NextRandom,第二个版本可以(并且很可能会)连续多次返回相同的“随机”数字,从而使其有效对于许多正常用例来说没有用,例如初始化随机数集合。不过,与第一个版本不同的是,第二个版本的优点是线程安全。

关于function - F# 生成随机数时的函数简洁性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38409548/

相关文章:

android - 在 Kivy 中引用另一个类的函数

javascript - 在循环内定义函数,i 的值未定义或不可预测

javascript - 函数应该在 jQuery 的扩展内部还是外部?

JavaScript - 声音不随随机值一起播放

c++ - 基于时间的旋转

f# - 如何将F#编译器安全地嵌入到asp.net Web应用程序中

具有阈值的 Python 集成梯形函数

asynchronous - Mono 下的 F# 任务并行性不会 "appear"并行执行

list - 与 List 类型匹配的 FSharp 模式

java - Math.random() 如何生成超出其 "native"范围的随机数?