function template
<algorithm>

std::shuffle

template <class RandomAccessIterator, class URNG>  void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
使用生成器随机重排范围内的元素
使用g作为均匀随机数生成器,随机重排范围[first,last)内的元素。

该函数通过调用g()来确定所选的元素,并将每个元素的值与某个其他随机选择的元素的值进行交换。

此函数适用于标准生成器,如<random>中定义的生成器。要不使用此类生成器对范围内的元素进行随机重排,请参见random_shuffle

此函数模板的行为等同于
1
2
3
4
5
6
7
8
template <class RandomAccessIterator, class URNG>
  void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g)
{
  for (auto i=(last-first)-1; i>0; --i) {
    std::uniform_int_distribution<decltype(i)> d(0,i);
    swap (first[i], first[d(g)]);
  }
}

参数

first, last
Forward iterators 指向要随机重排的序列的初始和结束位置。使用的范围是[first,last),它包含first指向的元素以及它和last指向元素之间的所有元素,但不包含last指向的元素。
ForwardIterator 应指向一个已定义swap 并且能够交换其参数值的类型。
g
用作随机性来源的均匀随机数生成器。
URNG 应为均匀随机数生成器,例如标准生成器类之一(有关更多信息,请参阅<random>)。

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// shuffle algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::shuffle
#include <array>        // std::array
#include <random>       // std::default_random_engine
#include <chrono>       // std::chrono::system_clock

int main () {
  std::array<int,5> foo {1,2,3,4,5};

  // obtain a time-based seed:
  unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();

  shuffle (foo.begin(), foo.end(), std::default_random_engine(seed));

  std::cout << "shuffled elements:";
  for (int& x: foo) std::cout << ' ' << x;
  std::cout << '\n';

  return 0;
}

可能的输出
shuffled elements: 3 1 4 2 5


复杂度

firstlast之间距离减一成线性关系:获取随机值并交换元素。

数据竞争

范围[first,last)内的对象将被修改。

异常

如果任何随机数生成、元素交换或迭代器操作引发异常,则会抛出异常。
请注意,无效参数会导致未定义行为

另见