注意,我的意思是mathematical combination,顺序的顺序无关紧要:
在数学中,组合是一种从较大的群体中选择多个东西的方式,其中(与排列不同)顺序无关紧要。
我试图从大小为M的向量中随机选择n个元素.n通常为M / 2(整数除法,M为奇数时为地板)。
我使用的算法是std::shuffle,然后是第一个M / 2元素。
随机生成器和均匀分布函数占用了我执行时间的70%左右,所以我还测试了自己的版本,它在向量的一半后停止了随机播放:
template <class RandomAccessIterator, class URNG>
inline void half_shuffle (RandomAccessIterator first, RandomAccessIterator last,
URNG&& g)
{
const unsigned half = (last - first) / 2;
for (unsigned i = 0; i < half; ++i) {
uniform_int_distribution<unsigned> d(i, last - first - 1);
swap (first[i], first[d(g)]);
}
}
首先,我想知道这看起来是否正确。在我可以提出的测试装备中,结果在所得到的混洗向量的后半部分看起来是均匀的,甚至(我在同一个向量上连续多次调用half_shuffle函数,所以这可能是原因。)
其次,这些函数应该给出M个元素中n个的随机置换。这意味着n个所选元素的顺序本身是随机的。这个额外的随机性对我来说没有意义,我想知道这些信息是否可以通过按顺序牺牲随机性来进一步减少计算时间。