SGI

random_shuffle

类别:算法 组件类型:函数

原型

Random_shuffle是重载名称;实际上有两个random_shuffle功能。
template <class RandomAccessIterator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
                    RandomNumberGenerator& rand)

说明

Random_shuffle在范围内随机重新排列元素[第一个,最后一个): 也就是说,它随机选择一个N!可能的排序,其中N最后一个 - 第一个. [1] 两个不同的版本random_shuffle。第一个版本使用内部随机数生成器,第二个版本使用 随机数生成器,一种特殊的 函数对象,明确地作为参数传递。

方法定义

在标准头中定义 algorithm,和非标准的向后兼容性头 algo.h 中。

对类型的要求

对于第一个版本对于第二个版本

预处理条件

复杂度

线性最后一个 - 第一个。如果最后一个!= 第一个,恰好(最后一个 - 第一个) - 1进行交换。

示例

const int N = 8;
int A[] = {1, 2, 3, 4, 5, 6, 7, 8};
random_shuffle(A, A + N);
copy(A, A + N, ostream_iterator<int>(cout, " "));
// The printed result might be 7 1 6 3 2 5 4 8, 
//  or any of 40,319 other possibilities.

说明

[1] 此算法在 Knuth (D. E. Knuth, 计算机编程的艺术。第 2 卷:半数算法,第二次编辑。Addison-Wesley,1981 年)的 3.4.2 节中进行了描述。Knuth 提到了 Moses 和 Oakford (1963 年) 和 Durstenfeld (1964 年) 的功劳。注意,有 N! 方法可以排列 N 元素的序列。Random_shuffle生成均匀分布的结果;也就是说,任何特定排序的概率为 1/N!。此注释很重要的原因在于,许多算法乍一看似乎实现了序列的随机改组,但实际上并未在 N! 可能的排序中产生均匀分布。也就是说,很容易错误地进行随机改组。

另请参见

随机样本, 随机样本_n, 下一个排列, 上一个排列随机数生成器
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息