如何使用<random>标题成员在C ++中生成随机数?</random>

时间:2010-09-14 16:06:59

标签: c++ visual-c++ c++11 visual-c++-2010

我学会了用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()?

2 个答案:

答案 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 对象将产生完全相同的随机数序列。