前言

在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 << " ";
	});
}

程序输出:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐