随机数生成器的类型和将它们作为参数的函数

时间:2016-10-16 18:11:19

标签: c++ random generator random-seed stochastic

按照Stephan T. Lavavej的讲话(见here),我正在使用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;
  }
}

我想使用shuffle函数(而不是random_shuffle)函数进行随机播放(再次在演讲中推荐)。从cppreference.com开始,我看到函数以URBG&&为参数。

我真的不明白URBG是什么。我尝试提供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;
  }
}

问题

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

2 个答案:

答案 0 :(得分:2)

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

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

但请注意,<random>中定义的大多数分布都是而不是均匀设计,因此无法在预期使用URBG的地方使用它们(您将得到偏差的结果)。< / p>

答案 1 :(得分:2)

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

g - 一个UniformRandomBitGenerator,其结果类型可转换为std :: iterator_traits :: difference_type

所以URBG可以是任何类型:

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

新的随机数生成器通常具有某种形式的状态,但是如果库函数可以以某种方式接受(例如,通过将随机生成器对象作为std :: shuffle来实现),那么肯定的是,它们可能是使用