有关使用URBG实现std :: shuffle的问题

时间:2019-08-01 05:23:09

标签: c++ random shuffle

参考std::random_shuffle, std::shuffle中概述的std::shuffle模板第三版的(可能)实现,

template<class RandomIt, class URBG>
void shuffle(RandomIt first, RandomIt last, URBG&& g)
{
    typedef typename std::iterator_traits<RandomIt>::difference_type diff_t;
    typedef std::uniform_int_distribution<diff_t> distr_t;
    typedef typename distr_t::param_type param_t;

    distr_t D;
    diff_t n = last - first;
    for (diff_t i = n-1; i > 0; --i) {
        using std::swap;
        swap(first[i], first[D(g, param_t(0, i))]);
    }
}

我试图了解如何将URBG对象gstd::uniform_int_distribution<diff_t>一起使用以在封闭范围[g, param_t(0, i)]中获得结果:

swap(first[i], first[D(g, param_t(0, i))]);

根据C++ named requirements: RandomNumberDistribution下对distr_t::param_type的解释:

  

给予

     
      
  • P,由D :: param_type命名的类型
  •   
  • d,D类型的值
  •   
  • p,类型P(可能是const)的值
  •   
  • g,g1,g2,满足UniformRandomBitGenerator类型的左值
  •   
     

以下表达式必须有效并具有指定的作用

     

d(g,p)的连续调用返回的数字序列   具有相同g的呼叫根据   p

参数化的分布

由于上述调用:

swap(first[i], first[D(g, param_t(0, i))]);

param_t(0, i)参数化的分布始终位于所需的分布范围内,调用g时也应在分布范围内生成随机结果类型(int)。

这种理解正确吗?

0 个答案:

没有答案