0

boost 中有两个随机整数生成器,boost::uniform_int<>boost::random::uniform_int_distribution<>,后者仅在 boost 1.47 之后添加。

我想知道它们的性能是否有任何差异(即它们生成的随机数的质量)?

此外,boost::uniform_int<>您需要通过 将其与随机引擎耦合variate_generate,但似乎在boost 的官方网站上您可以使用

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

没有变量生成。

这两种用法可以互换使用吗?

4

1 回答 1

1

boost::uniform_int<>继承自boost::random::uniform_int_distribution<>并且如果您查看 的标头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;
}

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

如果有任何不清楚的地方,请告诉我。

于 2013-02-07T21:40:41.527 回答