0

在 Stephan T. Lavavej 的演讲之后(请参阅此处),我正在使用 Mersenne Twister 随机数生成器,并使用这种代码生成随机数

#include <iostream>
#include <random>
int main()
{
  std::mt19937 mt(132);
  std::uniform_int_distribution<int> dist(0,50);
  for (int i =0;i<10;i++)
  {
     std::cout << dist(mt) << std::endl;
  }
}

我想使用shufflefunction (而不是random_shuffle) 函数来洗牌(再次在谈话中推荐)。从cppreference.com,我看到该函数需要一个URBG&&作为参数。

我真的不明白 aURBG是什么。我试着喂它mt19937,它似乎工作正常。

#include <iostream>
#include <random>
int main()
{
  std::vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  v.push_back(4);

  std::mt19937 mt(132);

  std::shuffle(v.begin(),v.end(),mt);
  for (int i=0;i<v.size();i++)
  {
    std::cout << v[i] << std::endl;
  }
}

问题

  • 什么是URBG? 是mt19937的子类URBG吗?
  • 作为任何函数的参数给出的所有类型的随机数生成器都可以产生随机结果(例如randshuffle或来自 的任何函数random.h)吗?
4

2 回答 2

3

URBG是模板参数的名称;它可以推导出为多种类型,包括std::mt19937. 如果您进一步查看 cppreference 页面,您会看到:

g -结果类型可转换为 std::iterator_traits::difference_type的UniformRandomBitGenerator

所以URBG可以是任何类型,例如:

  • URBG::result_type是无符号整数类型
  • URBG::min()URBG::result_type返回可以返回的最小值operator()(严格小于最大值)
  • URBG::max()URBG::result_type返回可以返回的最大值operator()(严格大于最小值)
  • URBG::operator()(应用于提供的实例)以摊销的常数时间返回闭区间中的值[URBG::min(), URBG::max()]
  • URBG::result_type可转换为std::iterator_traits<RandomIt>::difference_type

新的随机数生成器通常具有某种形式的状态,但如果库函数可以以某种方式接受它(例如,通过像 std::shuffle 那样采用随机生成器对象),那么当然可以使用它们。

于 2016-10-16T18:21:17.100 回答
2

URBG 是一个统一随机位生成器。用 C++ 的说法,它是一个函数对象,它返回具有均匀概率分布的无符号整数值(即,每个可能的结果与其他任何可能的结果一样可能出现)。这些要求当然在标准中得到严格定义。

std::mt19937实例是 URBG,因为它们满足这个定义。实例也满足它,因此在这种情况下,将一个或另一个传递给函数std::uniform_int_distribution绝对没有区别。<random>

但是,请注意,其中定义的大多数分布在设计<random>并不统一,因此它们不能用于预期 URBG 的地方(您将得到倾斜的结果)。

于 2016-10-16T18:21:14.240 回答