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

Don*_* Ch 3 random f# function

有人写这条线的原因是:

(fun max -> rndGen.Next(max))  
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

而不仅仅是声明param max upfront and calling rndGen.Next(max),就像这样?

let NextRandom (max: int) =
    let rndGen = new System.Random(int System.DateTime.Now.Ticks)
    rndGen.Next(max)
Run Code Online (Sandbox Code Playgroud)

ild*_*arn 5

不同之处在于:

  • 在第一个中,rndGen只播种一次并在其后重复使用,并且将在NextRandom定义范围的生命周期中生存 - 如果类范围是类的生命周期,或者模块范围是生命周期AppDomain.
  • 在第二,rndGen将创建 - 和种子!- 每次重新NextRandom调用.

实际效果是,如果NextRandom快速连续重复调用,第二个版本可以(很可能会)连续多次返回相同的"随机"数字,这使得它对许多正常使用情况有效无用,例如初始化随机集合数字.但是,与第一个版本不同,第二个版本具有线程安全的优点.

  • @Porton:这就是它的样子 - 第一个版本中返回的lambda是闭包的缩影.: - ] (2认同)