2016-07-16 75 views
3

是否有一個原因,一個寫行: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)) 

而不是僅僅宣佈帕拉姆最大前期和呼叫rndGen.Next(max),這樣的嗎?

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

剛跑來看差異;) –

+0

呵呵!要看到@FoggyFinder的不同之處,你必須多次運行第二個版本。除非在調用之間有足夠的時間,否則'System.DateTime.Now.Ticks'可能多次返回相同的值,因爲它的粒度非常粗糙。除此之外,要小心'System.Random'。這不完全是一個精心設計的RNG ......當我看到它用於認真的工作時,我會感到一種怪異的感覺。 – Vandroiy

回答

5

所不同的是壽命:

  • 在第一,rndGen僅接種一次,之後再利用,並能活的範圍的壽命,其中NextRandom定義 - 如果類作用域班級的生命週期,或者模塊範圍爲AppDomain的使用期限。
  • 在第二個,rndGen將被創建 - 並播種! - 每次調用NextRandom

的淨效應是,如果NextRandom快速連續多次調用,第二個版本可以(而且很可能會)相同的「隨機」數多次連續回,使其有效地無用的許多正常使用例如初始化一組隨機數。但是,與第一個版本不同,第二個版本具有線程安全的優點。

+0

謝謝,所以它幾乎就像第一個版本利用閉包來初始化rndGen一次..? – Porton

+2

@Porton:正是這樣 - 在第一個版本中返回的lambda是閉包的縮影。 : - ] – ildjarn