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

时间:2014-08-05 00:23:33

标签: c++ c++11 std shuffle prng

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

  

URNG必须符合UniformRandomNumberGenerator的要求。

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

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

  2.   
  3. G类满足统一随机数发生器的要求   表116中所示的表达式是有效的并具有指示   语义,如果G也满足其他所有要求   第26.5.1.3节。在该表和整个部分中:

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

116总结如下:

  • 返回类型为T
  • T是无符号整数类型
  • 克()
    • 返回类型T
    • 返回闭区间[G :: min(),G :: max()]。
    • 中的值
  • 返回类型T
  • 表示operator()可能返回的最小值。
  • 返回类型T
  • 表示operator()可能返回的最大值。
  •   

    以下关系应成立:G :: min()< ģ:: MAX()。

    更新

    要说明何时 T是无符号整数类型,它表示3.9.1 基本类型部分中涵盖的以下类型之一,其中包括:

    • unsigned char
    • unsigned short int
    • unsigned int
    • unsigned long int
    • unsigned long long int

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

    答案 1 :(得分:3)

    URNG是模板参数的名称 - 它不是特定类型。您需要实现满足特定要求的对象,然后将其传递给std::shuffle。这些方面的东西:

    class MyRNG {
    public:
      typedef size_t result_type;
      static size_t min() { return 0; }
      static size_t max() { return 42; }
      size_t operator()() {
        // generate a random number in the range [0, 42]
      }
    };
    
    std::shuffle(someVector.begin(), someVector.end(), MyRNG());
    

    您也可以考虑使用std::random_shuffle。该对象采用对象r,对于某个整数r(n)可以调用n,并生成[0, n)范围内的随机数。

    注意: std::random_shuffle在C ++ 14中已弃用。