STL之洗牌算法——std :: random_shuffle和std :: shuffle
前言在STL中,有两个函数,可以将容器中的数据进行洗牌——随机排序,这两个函数就是std :: random_shuffle和std :: shuffle。头文件这两个函数在头文件<algorithm>中定义,所以使用这两个函数需要包含头文件:#include<algorithm>。函数原型template<class _RanIt,class _Urng> i
·
前言
在STL中,有两个函数,可以将容器中的数据进行洗牌——随机排序,这两个函数就是std :: random_shuffle和std :: shuffle。
头文件
这两个函数在头文件<algorithm>中定义,所以使用这两个函数需要包含头文件:#include <algorithm>。
函数原型
template<class _RanIt,
class _Urng> inline
void shuffle(_RanIt _First, _RanIt _Last, _Urng&& _Func)
{ // shuffle [_First, _Last) using URNG _Func
typedef remove_reference_t<_Urng> _Urng0;
_Rng_from_urng<_Iter_diff_t<_RanIt>, _Urng0> _RngFunc(_Func);
_Random_shuffle1(_First, _Last, _RngFunc);
}
template<class _RanIt,
class _RngFn> inline
void random_shuffle(_RanIt _First, _RanIt _Last, _RngFn&& _RngFunc)
{ // shuffle [_First, _Last) using random function _RngFunc
_Random_shuffle1(_First, _Last, _RngFunc);
}
函数区别
两者区别在于第三个参数不同:std::random_shuffle第三个参数使用的是std::rand()作为随机数生成的种子,用来实现每次调用函数生成的顺序不一样。而std::shuffle()函数使用_Urng作为更好的随机生成器。std::shuffle()可以看做是std::random_shuffle的升级版。
使用方法
#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
#include <chrono>
using std::vector;
using std::cout;
using std::endl;
using std::random_shuffle;
using std::shuffle;
int random(int i)
{
return std::rand() % i;
}
int main()
{
vector<int> vec = { 1, 2, 3, 4, 5, 6 };
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
cout << endl;
//random_shuffle, 不使用随机生成器则每次调用后产生的结果都一样
random_shuffle(vec.begin(), vec.end());
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
cout << endl;
//random_shuffle, 使用随机生成器
random_shuffle(vec.begin(), vec.end(), random);
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
cout << endl;
//shuffle, 使用时间作为种子,需要包含头文件<chrono>和<random>
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
shuffle(vec.begin(), vec.end(), std::default_random_engine(seed));
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
cout << endl;
//shuffle, 使用种子
std::random_device rd;
shuffle(vec.begin(), vec.end(), std::default_random_engine(rd()));
for_each(vec.begin(), vec.end(), [](int x) {
cout << x << " ";
});
}
程序输出:
更多推荐
已为社区贡献1条内容
所有评论(0)