2016-07-16 6 views
3

は、1つの行を書き込み理由があります: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最大を宣言し、このように、rndGen.Next(max)を呼び出しますか?

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

ちょうど実行し、違いを参照してください;) –

+0

Hehe!違いを見るには、@ FoggyFinderは2回目のバージョンを複数回実行する必要があることを意味します。呼び出し間に十分な時間が経過しない限り、 'System.DateTime.Now.Ticks'はその粒度のために同じ値を何度も返すことがあります。これは驚くほど粗いことがあります。それを除いて、 'System.Random'には注意が必要です。それはうまく設計されたRNGではありません...私はそれが真剣な仕事で使用されて見たときに私は不気味な感じのビットを取得します。 – Vandroiy

答えて

5

差が寿命である:rndGenのみが一度に播種した後、再利用、およびNextRandomが定義されている範囲の寿命のために住んであり、最初に

  • - もしクラススコープクラスのライフタイム、モジュールスコープの場合はAppDomainの有効期間です。
  • 2番目には、rndGenが作成され、シードされます。 - 毎回NextRandomが呼び出されます。

正味の効果はNextRandomが矢継ぎ早に繰り返し呼び出された場合、第二のバージョンは(と非常に可能性が高いでしょう)、行に同じ「ランダム」番号を複数回返す多くの正常なため、それが効果的に無用作ることができるということです使用例乱数の集合を初期化する。しかし、最初のバージョンとは異なり、2番目のバージョンはスレッドセーフであるという利点があります。

+0

ありがとう、それはほとんどの最初のバージョンは、一度だけrndGenを初期化するために閉鎖を利用するようです..? – Porton

+2

@Porton:まさにそのようなものです。最初のバージョンで返されたラムダは、非常に閉鎖の典型です。 : - ] – ildjarn