设置种子提升::随机

ant*_*rts 9 c++ random boost seed

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

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;
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

# 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
Run Code Online (Sandbox Code Playgroud)

显然我做错了.我怎么能克服这个问题?

ant*_*rts 14

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

非常感谢!

  • 很高兴它成功了!顺便说一句,你被允许(并鼓励)接受你自己的答案,特别是如果它结合了几个人的想法来解决你的问题. (3认同)

Ala*_*kes 5

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

(分发可能会缓存一些您需要清除的状态.)

  • 正态分布的RNG使用[Box-Muller变换](http://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform),它成对生成随机数(参见:[Numerical Recipes examples](http:/ /dimacs.rutgers.edu/~graham/code.html)) (2认同)