当前位置: 首页 > article >正文

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。

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


http://www.kler.cn/a/564569.html

相关文章:

  • 光速解决phpstudy无法启动MySQL服务
  • Java—初始多线程
  • 【Java项目】基于Spring Boot的网上商城购物系统
  • 网络安全学习-常见安全漏洞检测以及修复方法-1
  • 泛微Ecode新增Button调用服务器中的JSP页面里的方法
  • Cannot resolve net.sf.json-lib:json-lib:2.4
  • 小红和小紫的拿球游戏(B组)
  • linux在vim中查找和替换
  • AI数据分析:用DeepSeek做数据清洗
  • ArcGIS Pro中打造精美高程渲染图的全面指南
  • 2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书
  • 数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例
  • 论文阅读笔记:Continual Forgetting for Pre-trained Vision Models
  • winfrom的progressBar 鼠标移上去显示 进度条的时间
  • 算法day2 dfs搜索2题
  • vscode下载安装教程(附安装包)vscode图文安装教程最新版
  • 一文掌握模拟登录的基本原理和实战
  • C++:多继承和虚继承
  • Javaweb后端数据库多表关系一对多,外键,一对一
  • 【斐波那契与7】