C++ 从向量数据生成随机组合

C++ 从向量数据生成随机组合,c++,random,combinations,combinatorics,shuffle,C++,Random,Combinations,Combinatorics,Shuffle,注意,我的意思是,序列的顺序无关紧要: 在数学中,组合是从一个较大的组中选择若干事物的一种方式,不同的排列顺序并不重要 我试图从大小为M的向量中随机选取n个元素。n通常是M/2整数除法,如果M是奇数 我使用的算法是,然后取第一个M/2元素 随机生成器和均匀分布函数占用了我大约70%的执行时间,因此我还测试了我自己的版本,该版本在向量减半后停止混洗: template <class RandomAccessIterator, class URNG> inline void half_s

注意,我的意思是,序列的顺序无关紧要:

在数学中,组合是从一个较大的组中选择若干事物的一种方式,不同的排列顺序并不重要

我试图从大小为M的向量中随机选取n个元素。n通常是M/2整数除法,如果M是奇数

我使用的算法是,然后取第一个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个选定元素的顺序本身是随机的。我对这种额外的随机性不感兴趣,我想知道这些信息是否有助于通过牺牲随机性来进一步减少计算时间。

你可以简单地进行M/2抛硬币,并跳过一半的时间。谢谢你的提示,但我不确定我是否理解。上面的代码已经执行了M/2随机数生成。即使是水库取样也需要M/2随机数,不是吗?