簡體   English   中英

C ++ std :: mt19937和rng狀態保存/加載和可移植性

[英]C++ std::mt19937 and rng state save/load & portability

我希望能夠保存並加載RNG的狀態,這樣我就可以從給定的點(應用程序保存/快照)重現相同的隨機值。

我看到有一個運算符<<和>>重載,它似乎將字符串保存為一系列數字。

  • 這是保存的最佳/唯一方式嗎? 我不介意只有固定大小的二進制狀態值而不是這個空格分隔的字符串,然后我需要為我的文件格式添加前綴或分隔符。
  • 這一切都是便攜式的嗎? 例如,我可以在不同的編譯器版本之間,甚至在MSVC和GCC之間傳輸它,以在給定相同配置的分布的情況下生成相同的數據集(在浮點的情況下為小的誤差范圍,對於整數數學是精確的)?

是的, operator<<operator>>是導入或導出隨機數生成器狀態的唯一方法。 如果您願意,可以輕松地將文本表示轉換為二進制文件。

反序列化和序列化mt19937狀態應該在實現之間可移植。 只要您確保流中充滿相同的語言環境,標准就可以很好地定義通過流操作符讀取和寫入引擎狀態的結果。

有關operator<<operator>>的要求,請參見§26.5.1.5,關於mersenne_twister_engine的文本表示 ,請mersenne_twister_engine ,其中mt19937是明確定義的typedef。

除了上一個答案:

  • 通過op <<導出文本表示只有在使用相同的語言環境通過op >>回讀時才會保存正確的RNG狀態。 更改區域設置將導致問題

  • default_random_engine的選擇是實現定義的。 它是一個typedef,但允許在不同平台上設置為不同的真實引擎(第26.5.5節)。 因此,使用op <<和op >>來保存/恢復狀態幾乎禁止使用默認引擎

  • 雖然生成器的指定非常嚴格,但我不認為平台之間的分布必須相同。 在這里,保存狀態對可重復性可能沒什么幫助

我建議將這份文件放在手邊,以防萬一http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM