我是否需要在OCaml中调用Random.self_init?

时间:2013-02-27 17:21:07

标签: functional-programming ocaml

首先,我在这个问题上并不关心seed

我的问题是,每次我想要在我的职能部门重新开始时,是否应该致电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 ()是否必要?

2 个答案:

答案 0 :(得分:6)

每次想要洗牌时都要把它称为熵。最好在程序开始时调用一次。但是如果你想为不同的程序运行获得不同的shuffle,你需要在某个时刻初始化随机生成器。对于某些应用程序,您需要使用自己选择的特定值进行初始化(例如,如果您希望以后能够重现结果)。为此,您可以使用Random.initRandom.full_init

答案 1 :(得分: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所说,如果你想重现你的结果,请使用它们。