2010-09-14 49 views
4

我学会了用C#编程,并开始学习C++。我正在使用Visual Studio 2010 IDE。我正在尝试使用<random>中的可用分布类生成随机数。例如,我试图做以下几点:如何使用<random>头成员在C++中生成随机数?

#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); 

最后一行给出一个编译器错误: 智能感知:无构造“的std :: TR1 :: variate_generator < _Engine,_Distrib> :: variate_generator [实例与_Engine = std :: tr1 :: knuth_b,_Distrib = std :: tr1 :: normal_distribution]“与参数列表相匹配

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

回答

4

C++ 0x中没有variate_generator,但std :: bind的作用也一样。下面的编译和运行在GCC 4.5.2和MSVC 2010速成:

#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时即可。

+0

酷感谢它的作品,现在我知道图书馆。 – 2010-09-14 17:22:05

2

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

+0

比答案更多评论,但非常准确! – Blindy 2011-04-22 00:51:11