函式模板
<algorithm>

std::random_shuffle

預設生成器 (1)
template <class RandomAccessIterator>  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);
指定生成器 (2)
template <class RandomAccessIterator, class RandomNumberGenerator>  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,                       RandomNumberGenerator& gen);
預設生成器 (1)
template <class RandomAccessIterator>  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);
指定生成器 (2)
template <class RandomAccessIterator, class RandomNumberGenerator>  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,                       RandomNumberGenerator&& gen);
隨機重排範圍內的元素
隨機重排範圍 [first,last) 中的元素。

該函式將每個元素的值與某個其他隨機選擇的元素的值進行交換。如果提供了函式 gen,它將決定每次選擇哪個元素。否則,該函式使用某個未指定的隨機源。

要指定一個均勻隨機生成器(如 <random> 中定義的那些),請參見 shuffle

此函式模板 (2) 的行為等同於
1
2
3
4
5
6
7
8
9
10
template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
                       RandomNumberGenerator& gen)
{
  iterator_traits<RandomAccessIterator>::difference_type i, n;
  n = (last-first);
  for (i=n-1; i>0; --i) {
    swap (first[i],first[gen(i+1)]);
  }
}

引數

first, last
隨機訪問迭代器,指向要隨機化序列的初始和結束位置。使用的範圍是 [first,last),它包含 first 和 last 之間的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
gen
一元函式,接受一個引數並返回一個值,兩者都可以轉換為/從適當的 difference type(由迭代器使用)。該函式應返回一個非負值,小於其引數。
這可以是一個函式指標或一個函式物件。

RandomAccessIterator 應指向一個定義了 swap 並且可以交換其引數值的型別。

返回值



示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// random_shuffle example
#include <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// random generator function:
int myrandom (int i) { return std::rand()%i;}

int main () {
  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  // using built-in random generator:
  std::random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

可能的輸出
myvector contains: 3 4 1 6 8 9 2 7 5


複雜度

線性複雜度,複雜度為 firstlast 之間的距離減一:獲取隨機值並交換元素。

資料競爭

範圍[first,last)內的物件將被修改。

異常

如果任何隨機數生成、元素交換或迭代器操作丟擲異常,則該函式丟擲異常。
請注意,無效引數會導致未定義行為

另見