2013-02-27 34 views
1

首先,我不在乎seed這個問題。我需要在OCaml中調用Random.self_init嗎?

我的問題是,我是否應該每次打電話給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.initRandom.full_init

+0

但我可以完全刪除?我的意思是,在我的程序中根本不要撥打 – 2013-02-27 17:27:24

+0

如果你根本不打電話,程序工作正常。但它每次都會產生相同的隨機數。 – 2013-02-27 17:29:09

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

我將包括後,我的類型定義和前我在每一個.ml文件的功能,我使用隨機的,所以每一個我運行我的程序時,我會得到一個不同的隨機數這條線。
對於大多數程序,我認爲Random.self_init比Random.init和Random.full_init更可取,但正如Jeffrey Scofield所說,如果您想重現結果,請使用它們。

+0

沒有必要在每個ml文件中都有該行。只要在主文件中保存一次就足夠了,但多次使用它不是問題。 – didierc 2013-03-01 23:43:45