类别:算法 | 组件类型:函数 |
template <class InputIterator, class RandomAccessIterator> Random AccessIterator random_sample(InputIterator first, InputIterator last, RandomAccessIterator ofirst, RandomAccessIterator olast) template <class InputIterator, class RandomAccessIterator, class RandomNumberGenerator> random_sample(InputIterator first, InputIterator last, RandomAccessIterator ofirst, RandomAccessIterator olast, RandomNumberGenerator& rand)
Random_sample复制n从元素[first, last)到[ofirst, olast),其中n为min(last - first, olast - ofirst)。返回值为ofirst + n.
第一个版本使用内部随机数生成器,而第二个版本使用随机数生成器,即一种特殊的函数对象,显式地作为参数传递。
int main() { const int N = 10; const int n = 4; int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int B[n]; random_sample(A, A+N, B, B+n); copy(B, B + n, ostream_iterator<int>(cout, " ")); // The printed value might be 1 6 3 5, // or any of 5039 other possibilities. }
[1] 这是克努斯 3.4.2 部分中“算法 R”(D. E. Knuth,计算机编程的艺术,第 2 卷:半数值算法,第二版。艾迪生-韦斯利,1981 年)。克努斯将功劳归于艾伦·沃特曼。请注意存在N! / n! / (N - n)!从nN元素的范围内选择元素样本的方法。Random_sample生成均匀分布的结果;即,选择任何特定元素的概率为n / N,以及任何特定采样的概率(不考虑元素顺序)为n! * (N - n)! / N!.
[2] 对于您的应用程序而言,如果保留输入范围内的相对顺序很重要,则应使用random_sample_n相反。的主要限制random_sample_n是输入范围必须由前向迭代器而不是输入迭代器组成。