std::shuffle
STD:随机[医]洗牌,性病:洗牌
Defined in header | | |
---|---|---|
template< class RandomIt > void random_shuffle( RandomIt first, RandomIt last | (1) | (until C++17) (deprecated in C++14) |
| (2) | |
template< class RandomIt, class RandomFunc > void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r | (until C++11) | |
template< class RandomIt, class RandomFunc > void random_shuffle( RandomIt first, RandomIt last, RandomFunc&& r | (since C++11) (until C++17) (deprecated in C++14) | |
template< class RandomIt, class URBG > void shuffle( RandomIt first, RandomIt last, URBG&& g | (3) | (since C++11) |
重新排序给定范围内的元素[first, last)
使得这些元素的每一个可能的排列都具有相同的出现概率。
1%29随机数生成器是实现定义的,但是函数std::rand
经常被使用。
2%29随机数发生器是函数对象。r
...
3%29随机数发生器是函数对象。g
...
参数
first, last | - | the range of elements to shuffle randomly |
---|---|---|
r | - | function object returning a randomly chosen value of type convertible to std::iterator_traits<RandomIt>::difference_type in the interval [0,n) if invoked as r(n) |
g | - | a UniformRandomBitGenerator whose result type is convertible to std::iterator_traits<RandomIt>::difference_type |
类型要求
---。
-性病::清除[医]参照系[医]T型<URBG>必须满足UniformRandomBitGenerator的要求。
返回值
%280%29
复杂性
直线在之间的距离first
和last
...
可能的实施
第一版
*。
模板<类随机>空随机[医]洗牌%28--第一次,最后一次--%29{TypeName STD::iterator[医]性状<RandomIt>*差异[医]类型i,n;n=最后一次;对于%28i=n-1;i>0;-i%29{使用std::交换;交换%281我,第一兰德%28%29%%28I+1%29%29;//rand%28%29%%28i+1%29实际上是正确的,因为所生成的数字//在大多数i值中没有均匀分布。正确的实现//将需要从本质上重新实现C++11 std::[医]INT[医]分布,//超出了本示例的范围。}}
第二版
模板<类随机,类随机>无效随机[医]洗牌%28--先随机,最后--随机--最后,--RandomFunc&r%29{type Name STD::iterator[医]性状<RandomIt>*差异[医]类型i,n;n=最后一次;对于%28i=n-1;i>0;-i%29{使用std::交换;交换%281我,第一R%28I+1%29%29;}
第三版
模板<class Randomit,类UniformRandomBitGenerator>voidShufferof28Randomit,Randomit Lest,UniformRandomBitGenerator&g%29{tyduf type Name std::iterator[医]性状<RandomIt>*差异[医]类型差异[医]T;tyUIDEf STD::Uniform[医]INT[医]分布<差[医]T>DIR[医]t;tyduif type Name disr[医]T::Param[医]Param型[医]t;disr[医]Dd;Dff[医]Tn=最后一位;对于%28diff[医]ti=n-1;i>0;-i%29{使用STD::SWAP;交换%28First我,第一D%28g,Param[医]t%280,i%29%29%29;}
例
下面的代码随机地对整数1.10进行洗牌:
二次
#include <random>
#include <algorithm>
#include <iterator>
#include <iostream>
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::random_device rd;
std::mt19937 g(rd()
std::shuffle(v.begin(), v.end(), g
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")
std::cout << "\n";
}
二次
可能的产出:
二次
8 6 10 4 2 3 7 1 9 5
二次
另见
next_permutation | generates the next greater lexicographic permutation of a range of elements (function template) |
---|---|
prev_permutation | generates the next smaller lexicographic permutation of a range of elements (function template) |
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。