2012-08-16 85 views
0

增强中有两个随机整数发生器,boost::uniform_int<>boost::random::uniform_int_distribution<>,后者仅在增强1.47后才添加。boost/random/uniform_int.hpp和boost/random/uniform_int_distribution.hpp可以互换使用吗?

我想知道他们的表现(即他们产生的随机数的质量)是否有任何不同?

此外,与boost::uniform_int<>你需要用随机引擎夫妇它通过variate_generate,但似乎对boost's official website,您可以使用

boost::random::mt19937 rng; 
boost::random::uniform_int_distribution<> six(1,6); 
int x = six(rng); 

wihout的变量产生。

这两个用法可以交替使用吗?

回答

1

boost::uniform_int<>继承自boost::random::uniform_int_distribution<>,如果你看header对于uniform_int<>,你可以看到它基本上只是调用基类函数。

由于uniform_int<>只是调用uniform_int_distribution<>的函数,所产生的数字没有区别。然而,Boost明确指出,uniform_int<>已被弃用,并且uniform_int_distribution<>应该用于所有新代码。

要回答第二个问题,uniform_int<>uniform_int_distribution<>均不需要boost::random::variate_generator<>才能发挥作用。为方便起见,variate_generator<>仅将随机数发生器(如boost::random::mt19937)与随机数分布(如uniform_int_distribution<>)相关联。如果您不使用variate_generator<>,则每次您希望生成一个随机数时,您都需要传递一个随机数生成器。这里有一个例子:

#include <boost/random/uniform_int.hpp> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/variate_generator.hpp> 

#include <iostream> 
#include <ctime> 

int main() 
{ 
    boost::mt19937 rand_generator(std::time(NULL)); 
    boost::random::uniform_int_distribution<> int_distribution(0, 100); 

    //Need to pass generator 
    std::cout << int_distribution(rand_generator) << std::endl; 

    //Associate generator with distribution 
    boost::random::variate_generator<boost::mt19937&, 
            boost::random::uniform_int_distribution<> 
            > int_variate_generator(rand_generator, int_distribution); 

    //No longer need to pass generator 
    std::cout << int_variate_generator() << std::endl; 
} 

注意,第一个电话是uniform_int_distribution<> operator()而第二个电话是variate_generator<> operator()。将生成器与分配关联不会更改原始生成器或分配对象。

请让我知道,如果有什么不清楚。

相关问题