可以互换使用boost/random/uniform_int.hpp和boost/random/uniform_int_

Can boost/random/uniform_int.hpp and boost/random/uniform_int_distribution.hpp be used interchangeably?

本文关键字:random boost int uniform hpp 互换      更新时间:2023-10-16

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

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

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

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

没有变量生成。

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

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;
}

请注意,第一次调用是uniform_int_distribution<> operator(),而第二次调用是variate_generator<> operator()。将生成器与分布关联不会更改原始生成器或分布对象。

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