STL之洗牌算法——std :: random_shuffle和std :: shuffle

前言

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

程序输出:

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双鱼理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值