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。

如有错误,敬请指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值