C++ algorithm之shuffle函数
1.介绍
在C++中,shuffle是标准库<algorithm>头文件的一个算法函数,对容器中的元素进行随机重排。它使用随机数生成器来打乱元素的顺序。
2.shuffle的用法
shuffle的作用是对容器中的元素进行随机重排。它接受一个范围 [first, last)
和一个随机数生成器,并使用该生成器来决定元素的排列顺序。
函数原型
template< class RandomIt, class URBG >
void shuffle(RandomIt first, RandomIt last, URBG&& g);
参数:
first和last:定义洗牌的元素范围[first, last)
。
g:一个均匀随机数生成器(Uniform Random Bit Generator),例如std::mt19937。
工作原理:shuffle使用随机数生成器生成随机数,并根据这些随机数交换容器中的元素,从而实现随机重排。
3.示例
(1)随机种子
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 初始化随机数生成器
std::random_device rd; // 用于获取随机种子
std::mt19937 g(rd()); // Mersenne Twister 随机数生成器
// 洗牌
std::shuffle(vec.begin(), vec.end(), g);
// 输出结果
for (int num : vec) {
std::cout << num << " ";
}
// 可能的输出: 3 1 5 2 4(每次运行结果不同)
return 0;
}
(2)固定种子
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// 使用固定种子初始化随机数生成器
std::mt19937 g(42); // 固定种子为 42
// 洗牌
std::shuffle(vec.begin(), vec.end(), g);
// 输出结果
for (int num : vec) {
std::cout << num << " ";
}
// 固定输出: 3 1 5 2 4(每次运行结果相同)
return 0;
}
4.注意事项
(1)随机数生成器的选择
shuffle需要一个均匀随机数生成器(URBG),例如std::mt19937。std::mt19937是一个高质量的伪随机数生成器。
(2)随机种子
使用random_device可以生成真随机数种子,但某些平台不支持。
如果需要可重复的结果,可以使用固定种子。
(3)适用范围
shuffle适用于所有支持随机访问迭代器的容器(例如:vector)。不适用于不支持随机访问的容器(例如 list)。
5.与random_shuffle的区别
在C++11前,C++提供了random_shuffle,但已被弃用。
random_shuffle使用rand()作为随机数生成器,rand()的随机性和质量较差。
shuffle是random_shuffle的替代品,推荐使用shuffle。
6.总结
-
shuffle 是 C++ 中用于随机重排容器元素的函数。
-
它需要指定一个随机数生成器(如mt19937)。
-
推荐使用 shuffle 而不是已弃用的 random_shuffle。
如有错误,敬请指正!!!