使用带自定义rng的std :: shuffle?

Yan*_*ick 2 c++ shuffle std prng c++11

我看到std :: shuffle采用URNG参数.我正在使用自定义版本的生成器(WELL512a),并希望将它与std :: shuffle一起使用.

我的问题是:是否可以将它与std :: shuffle一起使用?例如,可能使用URNG作为基类?

谢谢!

Sha*_*our 5

我们可以从std :: shuffle的cppreference文档中看到:

URNG必须满足UniformRandomNumberGenerator的要求.

遗憾的是,该网站没有记录这些要求是什么,因此我们需要查看草案C++ 11标准部分26.5.1.3 统一随机数生成器要求,其中说明如下:

  1. G类型的均匀随机数生成器g是返回无符号整数值的函数对象,使得可能结果范围中的每个值具有(理想地)返回的相等概率.

  2. 如果表116中所示的表达式有效并具有指示的语义,并且如果G也满足本节26.5.1.3的所有其他要求,则G类满足均匀随机数生成器的要求.在该表和整个本节中:

    • T是由G的关联result_type命名的类型,和
    • g是值

116总结如下:

  • 摹:: result_type的
    • 返回类型是T.
    • T是无符号整数类型
  • G()
    • 返回类型T.
    • 返回闭区间[G :: min(),G :: max()]中的值.
  • ģ::分钟()
    • 返回类型T.
    • 表示operator()可能返回的最小值.
  • 摹:: MAX()
    • 返回类型T.
    • 表示operator()可能返回的最大值.

以下关系应成立:G :: min()<G :: max().

更新

为了澄清何时T表示无符号整数类型,它表示3.9.1 基本类型部分中包含的以下类型之一,其中包括:

  • 无符号的字符
  • unsigned short int
  • unsigned int
  • unsigned long int
  • unsigned long long int

这还包括扩展的无符号整数类型,如uinit64_t,如果您的平台支持它们.