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.initまたはを使用できますRandom.full_init

于 2013-02-27T17:25:33.643 に答える
0
(* Initialize Random so it won't use the default seed *)
let _ = Random.self_init()

random を使用するすべての .ml ファイルで、型定義の後と関数の前にこの行を含めて、プログラムを実行するたびに異なる乱数を取得するようにします。
また、ほとんどのプログラムでは Random.init や Random.full_init よりも Random.self_init の方が好ましいと思いますが、Jeffrey Scofield が言ったように、結果を再現したい場合はそれらを使用してください。

于 2013-02-28T16:03:11.217 に答える