我学会了用C#编程并开始学习C ++。我正在使用Visual Studio 2010 IDE。我正在尝试使用<random>
中提供的分发类生成随机数。例如,我尝试执行以下操作:
#include <random>
std::normal_distribution<double> *normal = new normal_distribution<double>(0.0, 0.0);
std::knuth_b *engine = new knuth_b();
std::variate_generator<knuth_b, normal_distribution<double>> *rnd;
rnd = new variate_generator<knuth_b, normal_distribution<double>>(engine, normal);
最后一行给出了编译错误: IntelliSense:没有构造函数的实例“std :: tr1 :: variate_generator&lt; _Engine,_Distrib&gt; :: variate_generator [with _Engine = std :: tr1 :: knuth_b,_Distrib = std :: tr1 :: normal_distribution]”匹配参数列表< / p>
我的论点对我来说没问题,我做错了什么?当这里的variate_generator类被实例化时,你调用哪个方法获取下一个随机数,即.NET的System.Random.Next()?
答案 0 :(得分:4)
C ++ 0x中没有variate_generator,但std :: bind的工作原理也一样。以下编译并在GCC 4.5.2和MSVC 2010 Express中运行:
#include <random>
#include <functional>
#include <iostream>
int main()
{
std::normal_distribution<> normal(10.0, 3.0); // mean 10, sigma 3
std::random_device rd;
std::mt19937 engine(rd()); // knuth_b fails in MSVC2010, but compiles in GCC
std::function<double()> rnd = std::bind(normal, engine);
std::cout << rnd() << '\n';
std::cout << rnd() << '\n';
std::cout << rnd() << '\n';
std::cout << rnd() << '\n';
}
PS:尽可能避免new
。
答案 1 :(得分:2)
警告:请注意,上述解决方案绑定引擎的副本,而不是引擎的引用。因此,如果你也这样做: std :: function rnd2 = std :: bind(normal,engine); 那么 rnd 对象和 rnd2 对象将产生完全相同的随机数序列。