2013-02-27 36 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