我試圖挽救一個隨機數生成器的狀態如下:寫入和讀出一個隨機數狀態到文件
std::mt19937 rng
std::ofstream ofile("RngState.txt");
ofile << rng;
ofile.close();
我觀察的是狀態是1248號的載體而只有624號寫在文件中。有沒有辦法在一次嘗試中編寫和讀取所有1248個數字(我想我正在嘗試增加ofstream的容量/大小)。
在此先感謝。
我試圖挽救一個隨機數生成器的狀態如下:寫入和讀出一個隨機數狀態到文件
std::mt19937 rng
std::ofstream ofile("RngState.txt");
ofile << rng;
ofile.close();
我觀察的是狀態是1248號的載體而只有624號寫在文件中。有沒有辦法在一次嘗試中編寫和讀取所有1248個數字(我想我正在嘗試增加ofstream的容量/大小)。
在此先感謝。
正如@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;
}
好吧,我明白你在說什麼。這就是我所做的:1>在一個視覺工作室的實例中觀察發電機而不進行任何保存。 2>在Visual Studio的另一個實例中編寫和閱讀。我觀察到您顯示的向量_Ax的大小是1248,而索引624到1247的數字在上述兩個實例中是不同的。此外,我不回覆我期待回來的同一個隨機數。 – user1612986
@ user1612986不確定是否理解你的權利,但請測試我的示例 – yuyoyuppe
@ user1612986 *「我也不回覆我期待回來的同一個隨機數。」*這將成爲一個新問題的理由,其中包括[MCVE]。 –
可以明顯看出從algorithm,梅森倍捻機引擎需要記住的大小
n = "degree of occurrence"
整數
w = "word size"
位產生的系列。對於mt19937,根據定義,它保存着n = 624
和w = 32
。所以mt19937的狀態由624個32位整數唯一確定。
您的生成器的實現當然可以安全更加臨時的結果來加速計算,但引擎的狀態正好由這些624個整數給出,寫入狀態的其餘部分沒有意義。
也許只有624個數字代表狀態。相關:http://stackoverflow.com/questions/18361050/saving-random-number-generator-state-in-c11 – knivil
很可能不是。所有1248號碼都很重要。因爲當我在調試器中看到數字時,我發現它們都在變化。此外,當我嘗試讀回狀態並生成下一個隨機數時,我觀察到它與隨機數的不同,當我與發生器的並行實例進行比較時,得到的是隨機數。 – user1612986