Home C&C++函数库 c++ 语法 程序源码 Linux C库

std::

random_shuffle

函数模板  <algorithm>
C++98 generator by default (1)
template <class RandomAccessIterator>
  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);
specific generator (2)
template <class RandomAccessIterator, class RandomNumberGenerator>
  void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
                       RandomNumberGenerator&gen);

随机重新排列范围内的元素

随机重新排列[first,last)范围内的元素。

该函数将每个元素的值与其他随机选取的元素的值进行交换。 函数gen在提供时确定在每种情况下选择哪个元素。否则,该函数将使用一些未指定的随机性来源。

要指定一个统一的随机生成器,如<random>中定义的,请参见shuffle。

这个函数模板(2)的行为相当于:
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的类型,并交换其实参的值。

☉  返回值



none.

☣  示例



// 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

✥ 复杂度



first and last 之间的距离线性减1:获取随机值并交换元素。

⇄ 数据竞争


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

☂ 异常安全性



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

🍄  另请参阅



rotate 旋转元素(函数模板)
reverse 反转元素(函数模板)
generate 用函数生成范围的值(函数模板)
swap 交换两个对象的值(函数模板)

联系我们 免责声明 关于CandCplus 网站地图