2

首先,我不在乎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 ()有必要?

4

2 回答 2

6

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

于 2013-02-27T17:25:33.643 回答
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 所说,如果你想重现你的结果,请使用它们。

于 2013-02-28T16:03:11.217 回答