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