C++ random_shuffle()函数用法详解
和排序相反,有些场景中需要让数据呈现出一种随机排列的状态,例如在游戏、抽奖等程序中,也就是常说的“随机洗牌”。
C++标准库提供了 random_shuffle() 函数,定义在
random_shuffle() 函数的语法格式如下:
在上述两个 random_shuffle() 的版本中,第一个版本使用默认的随机数发生器,即函数 rand(),该函数可以获取一个 0~32767 之间的任意整数。第二个版本可以使用用户提供的随机数发生器,要求该发生器接受一个整数 N 作为参数,并返回区间 [0, N) 中的随机数。
由于计算机系统的限制,很难实现真正的随机数,所以这里所谓的随机数通常称为伪随机数。如果不加特殊设置,函数 rand() 的返回值也是有规律可循的。所以,为了能够使其返回值尽量随机,可以调用函数 srand(),并以当前时间为基准,设定随机数发生器的起始值。
【实例】下面的 C++ 程序演示了 random_shuffle() 函数的用法。
C++标准库提供了 random_shuffle() 函数,定义在
<algorithm>头文件中,它的功能就是将指定范围内的元素随机打乱顺序。random_shuffle() 函数的语法格式如下:
template <class RandomAccessIterator> void random_shuffle (RandomAccessIterator first, RandomAccessIterator last); template <class RandomAccessIterator, class RandomNumberGenerator> void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator&& gen);first 和 last 分别是要打乱的元素范围的开始和结束迭代器。
在上述两个 random_shuffle() 的版本中,第一个版本使用默认的随机数发生器,即函数 rand(),该函数可以获取一个 0~32767 之间的任意整数。第二个版本可以使用用户提供的随机数发生器,要求该发生器接受一个整数 N 作为参数,并返回区间 [0, N) 中的随机数。
由于计算机系统的限制,很难实现真正的随机数,所以这里所谓的随机数通常称为伪随机数。如果不加特殊设置,函数 rand() 的返回值也是有规律可循的。所以,为了能够使其返回值尽量随机,可以调用函数 srand(),并以当前时间为基准,设定随机数发生器的起始值。
【实例】下面的 C++ 程序演示了 random_shuffle() 函数的用法。
#include <iostream>
#include <vector>
#include <algorithm> // for random_shuffle
#include <ctime> // for time
#include <cstdlib> // for srand and rand
#include <functional> // for bind
// 自定义随机数生成器函数
struct RandomGenerator {
int operator()(int n) {
return std::rand() % n;
}
};
int main() {
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 使用默认的随机数生成器
std::srand(unsigned(std::time(nullptr))); // 初始化随机种子
std::random_shuffle(numbers.begin(), numbers.end());
std::cout << "Using default random number generator: ";
for (int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// 使用自定义的随机数生成器
std::random_shuffle(numbers.begin(), numbers.end(), RandomGenerator());
std::cout << "Using custom random number generator: ";
for (int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
运行结果为:
Using default random number generator: 10 5 8 1 7 3 4 9 2 6
Using custom random number generator: 5 9 10 1 3 2 4 8 6 7