2016-03-14 40 views
1

我試圖挽救一個隨機數生成器的狀態如下:寫入和讀出一個隨機數狀態到文件

std::mt19937 rng 
std::ofstream ofile("RngState.txt"); 
ofile << rng; 
ofile.close(); 

我觀察的是狀態是1248號的載體而只有624號寫在文件中。有沒有辦法在一次嘗試中編寫和讀取所有1248個數字(我想我正在嘗試增加ofstream的容量/大小)。

在此先感謝。

+0

也許只有624個數字代表狀態。相關:http://stackoverflow.com/questions/18361050/saving-random-number-generator-state-in-c11 – knivil

+0

很可能不是。所有1248號碼都很重要。因爲當我在調試器中看到數字時,我發現它們都在變化。此外,當我嘗試讀回狀態並生成下一個隨機數時,我觀察到它與隨機數的不同,當我與發生器的並行實例進行比較時,得到的是隨機數。 – user1612986

回答

1

正如@knivil所言,狀態可能只有624個數字。請告訴我們你是如何觀察1248的?

​​

編輯:

我有這個代碼,可以運行它,並檢查過一致的結果?

#include <fstream> 
#include <random> 
#include <iostream> 

std::mt19937 deser(std::string fname) 
{ 
    std::ifstream f{fname, std::ifstream::binary}; 
    std::mt19937 res; 
    f >> res; 
    return res; 
} 
void ser(std::string fname, std::mt19937 rng) 
{ 
    std::ofstream f(fname, std::ofstream::binary); 
    f << rng; 
} 

void printRand(std::mt19937 rng) 
{ 
    std::uniform_int_distribution<> uid{1, 100}; 
    std::cout << uid(rng) << std::endl; 
} 

int main() 
{ 
    auto fname{"R:\\RngState.txt"}; 

    std::mt19937 rng{std::random_device{}()}; 
    ser(fname, rng); 
    printRand(rng); 

    rng = deser(fname); 
    printRand(rng); 

    return 0; 
} 
+0

好吧,我明白你在說什麼。這就是我所做的:1>在一個視覺工作室的實例中觀察發電機而不進行任何保存。 2>在Visual Studio的另一個實例中編寫和閱讀。我觀察到您顯示的向量_Ax的大小是1248,而索引624到1247的數字在上述兩個實例中是不同的。此外,我不回覆我期待回來的同一個隨機數。 – user1612986

+0

@ user1612986不確定是否理解你的權利,但請測試我的示例 – yuyoyuppe

+0

@ user1612986 *「我也不回覆我期待回來的同一個隨機數。」*這將成爲一個新問題的理由,其中包括[MCVE]。 –

0

可以明顯看出從algorithm,梅森倍捻機引擎需要記住的大小

n = "degree of occurrence" 

整數

w = "word size" 

位產生的系列。對於mt19937,根據定義,它保存着n = 624w = 32。所以mt19937的狀態由624個32位整數唯一確定。

您的生成器的實現當然可以安全更加臨時的結果來加速計算,但引擎的狀態正好由這些624個整數給出,寫入狀態的其餘部分沒有意義。