2011-05-14 38 views
4

我新的C++ 0x隨機庫中玩耍,並在此基礎上的問題:
What is the standard way to get the state of a C++0x random number generator?
看來,如果你不知道種子用於隨機生成器的當前狀態,保存其狀態的唯一方法是將生成器存儲在流中。要做到這一點,我寫了下面的如何保存的C++ 0x隨機數的狀態產生

#include <iostream> 
#include <sstream> 
#include <random> 

int main(int /*argc*/, char** /*argv*/) 
{ 
    std::mt19937 engine1; 
    unsigned int var = engine1(); // Just to get engine1 out of its initial state 
    std::stringstream input; 
    input << engine1; 
    std::mt19937 engine2; 
    input >> engine2; 
    std::cout<<"Engine comparison: "<<(engine1 == engine2)<<std::endl; 
    std::cout<<"Engine 1 random number "<<engine1()<<std::endl; 
    std::cout<<"Engine 2 random number "<<engine2()<<std::endl; 
} 

此輸出

引擎比較:1
引擎1的隨機數581869302
引擎2隨機數4178893912

我有幾個問題:

  • 爲什麼engine1和engine2的下一個數字有所不同?
  • 爲什麼兩個引擎比較相同,即使他們的下一個數字是不同的?
  • 我在做什麼錯在我的例子中,以及在隨後的運行中保存隨機引擎的狀態以獲得可重複性的正確方法是什麼(假定您不知道設置期望狀態的種子)?

謝謝。

+0

注意在[爲Marsenne倍捻機維基百科的僞代碼(http://en.wikipedia.org/wiki/Mersenne_twister),其長度的數組' 624'被創建來存儲PRNG的狀態;如果它暴露了每個產出中的整個狀態,這就是它的週期爲2^19937 - 1而不是2^32或更短的原因之一。 – sarnold 2011-05-14 01:00:35

+0

我在gcc 4.6中得到了相同的結果,但它在gcc 4.7中得到了修復。 – 2012-02-07 02:51:10

回答

3

這看起來像是一個bug。我跑libc++您的代碼和輸出是:

Engine comparison: 1 
Engine 1 random number 581869302 
Engine 2 random number 581869302 
+1

當然我應該指出這個實現通常輸出581869302(http://dilbert.com/strips/comic/2001-10-25/):-) – 2011-05-14 02:01:10

+0

謝謝你的鏈接:)。根據我的可重複性要求,我可能會切換到巨魔隨機數發生器。 – user334066 2011-05-14 19:05:23