2016-07-16 3 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

спасибо, так что почти как 1-я версия использует закрытие только для инициализации rndGen один раз ..? – Porton

+2

@Porton: Это именно то, на что это похоже - возвращенная лямбда в первой версии является самым воплощением закрытия. : -] – ildjarn

Смежные вопросы