如何保存C++0X随机数生成器的状态

5
我正在尝试使用新的C++0X随机库,并基于以下问题进行:
什么是获取C++0x随机数生成器状态的标准方法?
看起来,如果您不知道随机生成器当前状态的种子,则保存其状态的唯一方法是将生成器存储在流中。 为此,我编写了以下内容。
#include <iostream>
#include <sstream>
#include <random>

int main(int /*argc*/, char** /*argv*/)
{
  std::mt19937 engine1;
  unsigned int var = engine1(); // Just to get engine1 out of its initial state
  std::stringstream input;
  input << engine1;
  std::mt19937 engine2;
  input >> engine2;
  std::cout<<"Engine comparison: "<<(engine1 == engine2)<<std::endl;
  std::cout<<"Engine 1 random number "<<engine1()<<std::endl;
  std::cout<<"Engine 2 random number "<<engine2()<<std::endl;
}

这会输出:

引擎比较: 1
引擎1随机数581869302
引擎2随机数4178893912

我有几个问题:

  • 为什么engine1和engine2的下一个数字不同?
  • 为什么两个引擎比较相等,即使它们的下一个数字不同?
  • 在我的例子中我做错了什么?正确的方法是什么来保存一个随机引擎的状态以便在后续运行中获取可重复性(假设您不知道种子来设置所需的状态)?

谢谢。


请注意,在Marsenne Twister的伪代码中,创建了一个长度为624的数组来存储PRNG的状态;这是其周期为2^19937-1而不是2^32或更短的原因之一,如果在每个输出中公开了整个状态。 - sarnold
我在gcc 4.6中得到了相同的结果,但在gcc 4.7中已经修复了。 - Neil G
1个回答

3

我认为这看起来像是一个bug。我在libc++上运行了你的代码,输出结果如下:

Engine comparison: 1
Engine 1 random number 581869302
Engine 2 random number 581869302

1
当然,我应该指出这个实现通常会输出581869302(http://dilbert.com/strips/comic/2001-10-25/) :-) - Howard Hinnant
谢谢提供链接:)考虑到我的可重复性要求,我可能会转换为巨魔随机数生成器。 - user334066

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接