C++ 如何重置随机数引擎?
我尝试使用C++11方法生成随机数:C++ 如何重置随机数引擎?,c++,random,c++11,C++,Random,C++11,我尝试使用C++11方法生成随机数: #include <random> #include <functional> #include <iostream> int main(int argc, char *argv[]) { std::normal_distribution<double> normal(0, 1); std::mt19937 engine; // Mersenne twister MT19937
#include <random>
#include <functional>
#include <iostream>
int main(int argc, char *argv[])
{
std::normal_distribution<double> normal(0, 1);
std::mt19937 engine; // Mersenne twister MT19937
auto generator = std::bind(normal, engine);
int size = 2;
engine.seed(0);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
std::cout << std::endl;
engine.seed(1);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
std::cout << std::endl;
engine.seed(0);
normal.reset();
for (int i = 0; i < size; ++i)
std::cout << generator() << std::endl;
return 0;
}
这意味着第一个和第三个序列是不相同的,即使它们是用相同的数字播种的。拜托,我做错什么了?是
std::normal_distribution<double>
std::正态分布
只是数学意义上的一个函数(确定地从x中产生y)还是我遗漏了什么?如果它只是一个函数,那么reset方法实际上是做什么的?您正在绑定引擎和发行版,下面的reset调用不会影响绑定函数 解决方案是将引用绑定到引擎和发行版
auto generator = std::bind(std::ref(normal), std::ref(engine));
您遇到的问题是
std::bind
<代码>标准::绑定复制其参数。std::bind
复制的原因是函数将在将来某个未知点调用,此时参数可能不再存在。这意味着您对引擎.seed()等的调用是无用的。使用std::ref
可以通过引用绑定参数,从而获得预期的输出
auto generator = std::bind(std::ref(normal), std::ref(engine));
就这样。我想我必须学习STL更多:)它与您的解决方案完美配合。谢谢<代码>自动生成器=标准::绑定(正常,标准::引用(引擎))代码>我想已经足够了。