9

我想通过使用不同的种子数来重置随机序列。运行此测试代码时:

boost::mt19937 gener(1);
boost::normal_distribution<> normal(0,1);
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal);
cout << rng() << endl;
cout << rng() << endl;
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
cout << rng() << endl;
gener.seed(1);
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
gener.seed(3);
cout << rng() << endl;

我得到以下输出:

# seed(1) via constructor
-2.971829031
1.706951063
-0.430498971
# seed(2)
-2.282022417
-0.5887503675
# seed(1)
0.2504171986
# seed(2)
-0.5887503675
# seed(3)
0.2504171986

显然我做错了什么。我该如何克服这个问题?

4

4 回答 4

14

按照 Jim、Alan 和 Igor 的建议,对代码进行了一些更改:rng.engine().seed()而不是gener.seed(), 并在调用rng.distribution().reset()后调用 to rng.engine().seed(),它就像一个魅力。

非常感谢!

于 2011-01-25T03:30:45.600 回答
5

您应该在调用gener.seed() 之后调用normal.reset()。这是为了确保 normal 的输出不依赖于来自gener的任何先前输出。

(分发可能正在缓存一些您需要清除的状态。)

于 2011-01-24T17:42:16.167 回答
1

我相信boost::variate_generator<>会复制您的boost::mt19937 gener对象。因此,当您为 的副本重新设定种子时,它对已经构建gener的对象没有影响。每次重新播种时rng构造一个新对象应该会给你你想要的行为(免责声明:未经测试!)rng

于 2011-01-24T06:11:22.277 回答
1

很高兴看到问题得到解决!但我想我只是想通了为什么艾伦的方法行不通......

编写时boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal),您没有创建另一个副本,因为gener它是通过引用调用,但您确实normal使用variate_generate.

因此normal.resetnormal您应该使用rng.distribution().reset(). 但是你可以保留gener.seed(),我怀疑它会产生相同的效果rng.engine().seed()

我在我的代码中对其进行了测试,它按预期工作。

好吧,以防万一有人关心:)

于 2012-08-17T07:28:26.617 回答