我想將std :: mt19937隨機數發生器的狀態保存在C++程序中,這樣我就可以在稍後的階段以相同的「隨機狀態」恢復我的程序。我也想在不同的平臺上使用我的程序(Linux和Mac)。C++中平臺依賴狀態mt19937?
考慮下面的小例子,在這裏我簡單的寫的當前狀態到stdout:
#include <iostream>
#include <random>
using namespace std;
static mt19937 rng;
int main() {
seed_seq seeder{1234};
rng = mt19937(seeder);
cout << "mt1: " << rng() << endl;
cout << "mt2: " << rng() << endl;
cout.imbue(locale("en_US.UTF-8"));
cout << rng << endl;
}
我的問題是,這對國家產生不同的輸出,取決於平臺我編譯這個上。在Linux系統(G ++ 7.1.0),我得到:
mt1: 2684129121
mt2: 3957864051
3,598,990,873 2,041,003,246 [...]
,而在我的Mac(蘋果LLVM 8.1.0),我得到:
mt1: 2684129121
mt2: 3957864051
1,413,537,266 1,230,536,264 [...]
基本上我想明白爲什麼狀態是不同以及我如何實現它們是相同的,這樣我就可以在系統之間保存和加載狀態。
此問題與此相關: C++ std::mt19937 and rng state save/load & portability但是,該線程不回答我的問題。它給出了使用相同區域設置的提示,但這似乎並沒有影響到狀態。
我不認爲該標準詳細說明了RNG狀態的確切細節。他們留待執行。你不能在實現之間移植它。 –