2017-08-19 75 views
2

我想將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但是,該線程不回答我的問題。它給出了使用相同區域設置的提示,但這似乎並沒有影響到狀態。

+1

我不認爲該標準詳細說明了RNG狀態的確切細節。他們留待執行。你不能在實現之間移植它。 –

回答

2

因爲這些類的具體實現取決於編譯器/平臺,所以你實際上不會達到STL的要求。

如果你想要一個一致的實現,那麼我建議你看看使用Boost。它具有與STL兼容的所有隨機類的實現。 (與STL相比,它還具有一些優勢,例如允許boost::random::random_device用作種子序列)。您也可以自行實現該類,不過Boost是可以使用的現有跨平臺實現。

+0

謝謝。看來唯一的選擇是使用另一個庫。 – TriSSSe