2016-07-16 9 views
3

Gibt es einen Grund, warum man schreibt die Zeile:F # Funktion Prägnanz, wenn Zufallszahl

(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)) 

Anstatt nur den param max im Voraus zu erklären und rndGen.Next(max) nennt, wie das?

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

Einfach laufen und sehen Unterschied;) –

+0

Hehe! Um den Unterschied zu sehen, muss @FoggyFinder mehrere Male die zweite Version ausführen. Wenn nicht genügend Zeit zwischen den Aufrufen verstrichen ist, kann 'System.DateTime.Now.Ticks' den gleichen Wert aufgrund seiner Granularität, die überraschend grob sein kann, mehrmals zurückgeben. Davon abgesehen, seien Sie vorsichtig mit 'System.Random'. Es ist nicht gerade ein gut gestalteter RNG ... Ich bekomme ein unheimliches Gefühl, wenn ich sehe, dass es in ernsthafter Arbeit verwendet wird. – Vandroiy

Antwort

5

Der Unterschied ist, Lebensdauer:

  • Im ersten rndGen ist nur einmal geimpft und danach wiederverwendet werden, und wird für die gesamte Lebensdauer des Umfangs leben, in der NextRandom definiert ist - wenn Klasse-scope die Lebensdauer der Klasse, oder wenn Modul-Bereich die Lebensdauer der AppDomain.
  • In der zweiten wird rndGen erstellt - und ausgesät! - jedes Mal, wenn NextRandom aufgerufen wird.

Der Nettoeffekt ist, dass, wenn NextRandom wiederholt in schnellen Folge aufgerufen wird, kann die zweite Version (und sehr wahrscheinlich wird) die gleichen „Zufallsgenerator“ mehrmals in einer Zeile zurückgeben, so dass es effektiv nutzlos für viele normalen Anwendungsfälle z Initialisieren einer Sammlung von Zufallszahlen. Im Gegensatz zur ersten Version hat die zweite Version den Vorteil, threadsicher zu sein.

+0

danke, also ist es fast so, als ob die 1. version closure verwendet, um rndGen nur einmal zu initialisieren ..? – Porton

+2

@Porton: Genau so ist es - das zurückgegebene Lambda in der ersten Version ist der Inbegriff einer Schließung. : -] – ildjarn