参考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
对象g
与std::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)。
这种理解正确吗?