【问题标题】:Types of random number generators and functions that take them as arguments随机数生成器的类型和将它们作为参数的函数
【发布时间】:2017-02-25 16:30:01
【问题描述】:

在 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&amp;&amp; 作为参数。

我不太明白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;
  }
}

问题

  • 什么是URBGmt19937URBG 的子类吗?
  • 作为参数提供给任何函数的所有类型的随机数生成器能否产生随机结果(例如randshuffle 或来自random.h 的任何函数)?

【问题讨论】:

  • 如果您再次查看链接到的引用,您将看到 URBG 是一个模板参数。类型是任何与例如接口匹配的东西。 std::mt19937 类。有关详细信息,请参阅链接参考的“类型要求”部分。

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


【解决方案1】:

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

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

所以URBG 可以是满足以下条件的任何类型:

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

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

【讨论】:

    【解决方案2】:

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

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

    但是,请注意,&lt;random&gt; 中定义的大多数分布在设计上不是统一的,因此它们不能用于预期 URBG 的地方(你会得到倾斜的结果)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2018-09-19
      • 2022-12-05
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多