写入和读取随机数状态到文件

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 = 624w = 32。所以mt19937的状态由624个32位整数唯一确定

您的生成器实现当然可以安全地获得更多临时结果以加快计算速度,但是引擎的状态恰好由这 624 个整数给出,写入其余状态没有意义。