有人写下这一行是有原因的吗:
(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/