生成随机数时F#函数简洁

时间:2016-07-16 09:10:46

标签: 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))

而不是仅仅预先声明param max并调用rndGen.Next(max),就像这样?

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

1 个答案:

答案 0 :(得分:5)

不同之处在于:

  • 在第一个中,rndGen仅播种一次并在此后重复使用,并且将在定义NextRandom的范围的生命周期内生效 - 如果类范围是类的生命周期,或者if if module-scope AppDomain
  • 的生命周期
  • 在第二个中,rndGen将被创建 - 并播种! - 每次调用NextRandom时重新启动。

净效应是如果快速连续重复调用NextRandom,则第二个版本可以(并且很可能会)返回相同的"随机"连续多次编号,使其对许多正常使用的例子有效无用,例如初始化一组随机数。但是,与第一个版本不同,第二个版本具有线程安全的优势。