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 |
交换两个对象的值(函数模板) |