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

时间:2016-03-14 15:33:01

标签: c++ random state ofstream

我试图保存随机数生成器的状态,如下所示:

.my-tall-div {
  background: url(/path/to/image.jpeg) center center no-repeat;
  background-size: cover;
}

我观察到的是状态是1248个数字的向量而且只有624个数字被写入文件中。有没有办法在一次尝试中写入和读取所有1248个数字(我想我正在尝试增加ofstream的容量/大小)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

正如@knivil所说,州只能代表624个号码。请告诉我们你是如何观察1248的?

VS 2015

修改

我对此代码有一致的结果,您可以运行它并检查吗?

#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 :(得分:0)

algorithm可以看出,Mersenne Twister引擎需要记住

n = "degree of occurrence"

大小整数

w = "word size"

用于生成系列的位。对于mt19937,它根据定义保留n = 624w = 32。因此mt19937的状态由624个32位整数唯一确定。

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