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

std::

shuffle

函数模板  <algorithm>
template <class RandomAccessIterator, class URNG>
  void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);

使用生成器随机重新排列范围内的元素

使用g作为均匀随机数生成器,对[first,last)范围内的元素进行随机重新排列。

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

该函数与<random>中定义的标准生成器一起工作。 要在不使用这样的生成器的情况下打乱范围内的元素,请参阅random_shuffle。

这个函数模板的行为相当于:
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
指向要打乱序列的初始和最终位置的随机访问迭代器。 使用的范围是[first,last), 它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。
随机访问迭代器(ForwardIterator)必须指向一个定义了swap的类型,并交换其实参的值。

g
一种均匀随机数产生器,用作随机性的来源。
URNG应该是一个统一的随机数生成器,例如一个标准生成器类(更多信息见<random>)。

☉  返回值



none

☣  示例



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

✥ 复杂度



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

⇄ 数据竞争


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

☂ 异常安全性



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

🍄  另请参阅



default_random_engine 默认随机引擎(类)
random_shuffle 随机重新排列范围内的元素(函数模板)
swap 交换两个对象的值(函数模板)

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