首页 > 编程笔记

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

推荐阅读