写入和读取随机数状态到文件
Writing and Reading a random number state to file
我正在尝试按如下方式保存随机数生成器的状态:
std::mt19937 rng
std::ofstream ofile("RngState.txt");
ofile << rng;
ofile.close();
我观察到的状态是一个包含 1248 个数字的向量,文件中只写入了 624 个数字。有没有办法一次写入和读取所有 1248 个数字(我想我正在尝试增加 ofstream 的 capacity/size)。
提前致谢。
正如@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;
}
从 algorithm 可以明显看出,Mersenne Twister 引擎需要记住
n = "degree of occurrence"
整数大小
w = "word size"
位来生成系列。对于 mt19937,它根据定义包含 n = 624
和 w = 32
。所以mt19937的状态由624个32位整数唯一确定
您的生成器实现当然可以安全地获得更多临时结果以加快计算速度,但是引擎的状态恰好由这 624 个整数给出,写入其余状态没有意义。
我正在尝试按如下方式保存随机数生成器的状态:
std::mt19937 rng
std::ofstream ofile("RngState.txt");
ofile << rng;
ofile.close();
我观察到的状态是一个包含 1248 个数字的向量,文件中只写入了 624 个数字。有没有办法一次写入和读取所有 1248 个数字(我想我正在尝试增加 ofstream 的 capacity/size)。
提前致谢。
正如@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;
}
从 algorithm 可以明显看出,Mersenne Twister 引擎需要记住
n = "degree of occurrence"
整数大小
w = "word size"
位来生成系列。对于 mt19937,它根据定义包含 n = 624
和 w = 32
。所以mt19937的状态由624个32位整数唯一确定
您的生成器实现当然可以安全地获得更多临时结果以加快计算速度,但是引擎的状态恰好由这 624 个整数给出,写入其余状态没有意义。