2013-02-27 3 views
1

Прежде всего, в этом вопросе мне все равно seed.Нужно ли мне звонить Random.self_init в OCaml?

Мой вопрос заключается в том, следует ли мне звонить Random.self_init каждый раз, когда я хочу начать новый запуск в своей функции?

let shuffle l = 
    Random.self_init(); 
    let tagl = List.map (fun x -> (Random.bits(), x)) l in 
    List.map (fun x -> snd x) (List.sort compare tagl);; 

, например, в приведенном выше коде, это Random.self_init() необходимо или нет?

ответ

5

Это бесполезно энтропии, чтобы называть его каждый раз, когда вы хотите перетасовать. Лучше позвонить ему один раз в начале вашей программы. Но вам нужно инициализировать случайный генератор в какой-то момент, если вы хотите получить разные перетасовки для разных прогонов программы. Для некоторых приложений вы хотите инициализировать определенные вами значения (например, если вы хотите воспроизвести результаты позже). Для этого вы можете использовать Random.init или Random.full_init.

+0

но могу ли я полностью удалить это? Я имею в виду, вообще не звоню в моей программе. –

+0

Если вы вообще не звоните, программа работает нормально. Но он генерирует одинаковые случайные числа каждый раз. –

0
(* Initialize Random so it won't use the default seed *) 
let _ = Random.self_init() 

Я хотел бы включить эту строку после моих определений типов и перед моими функциями в каждом .ml файла, где я использую случайным, так что каждый раз, когда я запускаю свою программу, я хотел бы получить различные случайные числа.
И я бы подумал, что Random.self_init более предпочтительный по сравнению с Random.init и Random.full_init для большинства программ, но, как сказал Джеффри Скофилд, если вы хотите воспроизвести свои результаты, используйте их.

+0

Нет необходимости иметь эту строку в каждом файле ml. Просто один раз в основном файле достаточно, но это не проблема, чтобы иметь его несколько раз. – didierc

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