4

我学会了用 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: no instance of constructor "std::tr1::variate_generator<_Engine, _Distrib>::variate_generator [with _Engine=std::tr1::knuth_b, _Distrib=std::tr1:: normal_distribution]" 匹配参数列表

我的论点对我来说看起来不错,我做错了什么?当这里的variate_generator类被实例化时,你调用哪个方法来获取下一个随机数即.NET的System.Random.Next()?

4

2 回答 2

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

于 2010-09-14T16:36:12.367 回答
2

警告:请注意,上述解决方案绑定了引擎的副本,而不是对引擎的引用。因此,如果你也这样做: std::function rnd2 = std::bind(normal, engine); 那么rnd对象和rnd2对象将产生完全相同的随机数序列。

于 2011-03-08T00:29:51.803 回答