是否有理由为此写一行:
(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)
答案 0 :(得分:5)
不同之处在于:
rndGen
仅播种一次并在此后重复使用,并且将在定义NextRandom
的范围的生命周期内生效 - 如果类范围是类的生命周期,或者if if module-scope AppDomain
。rndGen
将被创建 - 并播种! - 每次调用NextRandom
时重新启动。净效应是如果快速连续重复调用NextRandom
,则第二个版本可以(并且很可能会)返回相同的"随机"连续多次编号,使其对许多正常使用的例子有效无用,例如初始化一组随机数。但是,与第一个版本不同,第二个版本具有线程安全的优势。