在 OCaml 的 StdLib 中序列化 "Module Random" 的当前状态
Serializing the current state of "Module Random" in OCaml's StdLib
我一定已经阅读了关于标准库模块 Random
和 Random.State
的 OCaml 手册页六次(可能更频繁),但我不知道如何序列化PRNG 当前的内部状态。
这是我到目前为止学到的东西:
模块Random
和Random.State
都在一个从外部看是抽象/不透明的状态下运行。
两个模块都提供了两个/三个初始化器,但是导出当前状态的函数......我看不到它们:(
我能做什么?请帮忙!
您可以使用 Marshal 模块序列化(和反序列化)状态,例如,
let save_random_state out =
Marshal.to_channel out (Random.get_state ()) []
let load_random_state inp =
Random.set_state (Marshal.from_channel inp)
但是,如果您只想让 Random
模块生成相同的伪随机数序列,那么最好只使用相同的状态进行初始化,即使用相同的种子,例如,如果您将开始你的程序,
let () = Random.set_state (Random.State.make [|42|])
您将获得程序的确定性行为,因为 Random
模块将始终生成相同的数字。
我一定已经阅读了关于标准库模块 Random
和 Random.State
的 OCaml 手册页六次(可能更频繁),但我不知道如何序列化PRNG 当前的内部状态。
这是我到目前为止学到的东西:
模块
Random
和Random.State
都在一个从外部看是抽象/不透明的状态下运行。两个模块都提供了两个/三个初始化器,但是导出当前状态的函数......我看不到它们:(
我能做什么?请帮忙!
您可以使用 Marshal 模块序列化(和反序列化)状态,例如,
let save_random_state out =
Marshal.to_channel out (Random.get_state ()) []
let load_random_state inp =
Random.set_state (Marshal.from_channel inp)
但是,如果您只想让 Random
模块生成相同的伪随机数序列,那么最好只使用相同的状态进行初始化,即使用相同的种子,例如,如果您将开始你的程序,
let () = Random.set_state (Random.State.make [|42|])
您将获得程序的确定性行为,因为 Random
模块将始终生成相同的数字。