C++中std::shuffle的使用小结

 更新时间:2025年04月08日 09:37:17   作者:点云SLAM  
std::shuffle是C++标准库中的一个函数,用于对容器中的元素进行随机排列,本文主要介绍了C++中std::shuffle的使用小结,具有一定的参考价值,感兴趣的可以了解一下

std::shuffle 的使用

std::shuffle 是 C++ 标准库中的一个函数,用于对容器中的元素进行随机排列(洗牌)。它的实现基于现代随机数生成器,因此比 std::random_shuffle 更安全和灵活(std::random_shuffle 在 C++14 被弃用,C++17 后被移除)。

1. 语法

#include <algorithm>
#include <random>

std::shuffle(RandomIt first, RandomIt last, URBG&& g);
  • first 和 last:表示要随机打乱的范围([first, last))。
  • g:随机数生成器,必须符合 UniformRandomBitGenerator(如 std::mt19937)。
  • 返回值:无(函数会直接修改输入范围的内容)。

2. 使用示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>  // 需要包含 <random> 头文件

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    // 创建随机数生成器
    std::random_device rd;  // 随机设备(硬件熵源)
    std::mt19937 g(rd());   // 梅森旋转算法(常用的随机数引擎)

    // 打乱顺序
    std::shuffle(vec.begin(), vec.end(), g);

    // 输出打乱后的结果
    std::cout << "Shuffled vector: ";
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 代码解析

  • 创建随机数生成器

    • std::random_device rd;:用于生成种子。
    • std::mt19937 g(rd());:使用梅森旋转算法(Mersenne Twister)作为伪随机数引擎。
  • 调用 std::shuffle 进行洗牌

    • std::shuffle(vec.begin(), vec.end(), g); 重新打乱 vec 中的元素顺序。
  • 打印打乱后的数组

    • 遍历并输出 vec

4. 示例输出

Shuffled vector: 3 7 5 9 1 4 2 8 6

(输出的顺序是随机的,每次运行结果可能不同。)

5. 重要说明

为什么不用 std::random_shuffle

  • std::random_shuffle 需要内部调用 rand(),它的随机性较弱,而且 rand() 不是线程安全的。
  • std::shuffle 允许使用高质量的随机数生成器(如 std::mt19937)。

std::mt19937 vs std::default_random_engine

  • std::default_random_engine 可能因不同的编译器实现不同,因此推荐使用 std::mt19937

如何使用固定种子进行可复现的随机洗牌?

std::mt19937 g(42);  // 42 作为固定的随机种子
std::shuffle(vec.begin(), vec.end(), g);

这样每次运行代码都会得到相同的打乱结果。

6. 适用场景

  • 随机排序数据
  • 生成随机测试用例
  • 洗牌(如扑克牌游戏)
  • 打乱数据以避免排序偏差(如机器学习数据预处理)

7. 结论

std::shuffle 是现代 C++ 中推荐的随机洗牌方法,结合 std::mt19937 可以提供高质量的随机性,适用于各种随机排列的场景。

🚀 推荐使用 std::shuffle 代替 std::random_shuffle,并搭配 std::mt19937 以获得更好的随机性和可控性!

到此这篇关于C++中std::shuffle的使用小结的文章就介绍到这了,更多相关C++ std::shuffle内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++ 虚函数与纯虚函数的区别(深入分析)

    c++ 虚函数与纯虚函数的区别(深入分析)

    本篇文章是对c++中虚函数与纯虚函数的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言中如何通过指针参数返回值

    C语言中如何通过指针参数返回值

    这篇文章主要介绍了C语言中如何通过指针参数返回值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C语言扫雷游戏的简单实现

    C语言扫雷游戏的简单实现

    这篇文章主要为大家详细介绍了C语言扫雷游戏的简单实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言调用Python代码的方法

    C语言调用Python代码的方法

    这篇文章主要介绍了C语言调用Python代码的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++中浅拷贝与深拷贝的详解及其作用介绍

    C++中浅拷贝与深拷贝的详解及其作用介绍

    这篇文章主要介绍了C++中浅拷贝与深拷贝的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • QT实现FTP上传文件

    QT实现FTP上传文件

    这篇文章主要为大家详细介绍了QT实现FTP上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用C++创建多个IPC机制的上层接口

    使用C++创建多个IPC机制的上层接口

    设计一个上层的IPC接口,这个接口将在未来封装底层的通信机制,这样的设计要求接口足够抽象,以便于底层实现的细节对上层用户透明,本文给大家介绍了如何使用C++创建多个IPC机制的上层接口,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • C语言实现简单的三子棋游戏

    C语言实现简单的三子棋游戏

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • C++11正则表达式详解(regex_match、regex_search和regex_replace)

    C++11正则表达式详解(regex_match、regex_search和regex_replace)

    正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,下面这篇文章主要介绍了C++11正则表达式(regex_match、regex_search和regex_replace)的相关资料,需要的朋友可以参考下
    2022-09-09
  • C++用boost.signal实现多播委托

    C++用boost.signal实现多播委托

    这篇文章介绍了C++用boost.signal实现多播委托的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06

最新评论