新闻中心

c++怎么打乱一个数组或vector (shuffle)_c++随机打乱算法实现

2025-11-01
浏览次数:
返回列表
推荐使用std::shuffle打乱数组或vector,需配合随机数引擎如std::mt19937,并用std::chrono设置种子;其比旧的random_shuffle更安全高效,底层可基于Fisher-Yates算法手动实现,遍历从后往前随机交换元素,注意避免使用rand()和重复种子以保证随机性。

c++怎么打乱一个数组或vector (shuffle)_c++随机打乱算法实现

在C++中打乱一个数组或vector(即随机重排元素),推荐使用标准库提供的std::shuffle函数,它比旧的std::random_shuffle更安全、更高效。下面介绍具体用法和一个手动实现的随机打乱算法(Fisher-Yates洗牌算法)。

使用 std::shuffle 打乱 vector 或数组

std::shuffle 定义在 <algorithm></algorithm> 头文件中,需要配合随机数生成器使用。相比已废弃的random_shuffle,它要求显式提供随机数引擎,结果更可预测且符合现代C++规范。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <ctime>
<p>int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};</p><pre class="brush:php;toolbar:false;">// 创建随机数生成器
unsigned seed = std::chrono::steady_clock::now().time_since_epoch().count();
std::mt19937 rng(seed);

// 打乱vector
std::shuffle(vec.begin(), vec.end(), rng);

for (int x : vec) {
    std::cout << x << " ";
}
std::cout << std::endl;

return 0;

}

如果是普通数组,也可以类似操作:

int arr[] = {1, 2, 3, 4, 5};
int n = 5;
std::shuffle(arr, arr + n, rng);

Fisher-Yates 洗牌算法手动实现

如果想理解底层原理或在不支持std::shuffle的环境中使用,可以手动实现经典的Fisher-Yates算法。从后往前遍历,每次随机选择一个前面的位置进行交换。

短影AI 短影AI

长视频一键生成精彩短视频

短影AI 170 查看详情 短影AI 实现代码:

#include <iostream>
#include <vector>
#include <random>
#include <ctime>
<p>void fisherYatesShuffle(std::vector<int>& vec) {
std::mt19937 rng(std::time(nullptr));
int n = vec.size();</p><pre class="brush:php;toolbar:false;">for (int i = n - 1; i > 0; --i) {
    std::uniform_int_distribution<int> dist(0, i);
    int j = dist(rng);  // 随机选 [0, i] 中的一个下标
    std::swap(vec[i], vec[j]);
}

}

调用方式:

std::vector<int> data = {10, 20, 30, 40, 50};
fisherYatesShuffle(data);
for (int x : data) std::cout << x << " ";

注意事项

使用随机打乱时注意以下几点:

  • 不要每次都用std::time(nullptr)作为种子,频繁调用可能导致相同序列;建议使用std::random_devicestd::chrono获取更唯一的种子。
  • std::shuffle要求随机数生成器满足均匀分布特性,推荐使用std::mt19937
  • 避免使用rand() % n生成随机索引,它分布不均,尤其当n接近RAND_MAX时偏差明显。

基本上就这些。优先使用std::shuffle,简洁又可靠。

以上就是c++++怎么打乱一个数组或vector (shuffle)_c++随机打乱算法实现的详细内容,更多请关注其它相关文章!


# 见性  # 青岛关键词排名实力乐云seo  # 五金建材推广网站有哪些  # 河南网站seo优化技巧  # 广告网站建设步骤图片  # 东莞网站优化体验服务  # 关键词排名推广软件 s  # 河南网站建设价格多少  # 朝天门装修网站推广  # 无锡个人网站建设分类公示  # 中堂镇网站推广公司  # 解决问题  # 中文网  # 相关文章  # 数组  # 多线程  # 遍历  # 如何实现  # 推荐使用  # 递归  # 随机数  # 标准库  # stream  # ios  # ai  # go  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: css链接悬停下划线样式如何自定义_使用::after结合content和transition  如何更改在 Excel 中打开超链接时的默认浏览器  蛙漫移动版在线看 蛙漫手机浏览器直达入口  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  J*aScript对象创建方式_J*aScript设计模式应用  12306选座如何查看座位示意图_12306座位示意图解读与使用  J*aScript中管理异步API调用:确保操作顺序与数据一致性  一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化  J*aScript中localStorage数据的获取、清洗与格式化教程  在命令行怎么运行html项目_命令行运行html项目方法【教程】  蛙漫官方正版入口 蛙漫网页在线全集免费观看  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  学习通在线学习平台 学习通网页版直接进入课程中心  Go语言中JSON数据解码与字段访问指南  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  win11 Snap Layouts怎么用 Win11窗口布局与分屏多任务高效指南【必学】  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  动漫花园资源网使用步骤_动漫花园资源网下载流程  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  b站赚钱渠道_b站收益来源  PHP 枚举:根据字符串获取枚举案例的策略与实现  Linux如何构建多环境配置管理_Linux多环境配置方案  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  狙击外星人小游戏开始_狙击外星人小游戏立即开始  顺丰快递查询系统 官方正版查询入口  知音漫客正版漫画平台_知音漫客官网账号登录  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  抖音网页版快捷访问 抖音网页版网页版入口操作教程  邮政快递单号查询入口 邮政快递物流信息在线查询入口  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看  Python多线程中正确使用sigwait处理SIGALRM信号  特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相  Golang如何使用const iota_Go iota常量计数器讲解  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  excel怎么制作工资条 excel快速生成工资条的方法  网易大神账号申诉需要多久_网易大神账号申诉流程说明  J*aScript map 方法中处理循环元素为空数组的策略  在React函数组件中利用原生HTML5进行邮箱地址验证  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  蛙漫2台版漫画地址 Manwa2正版网页版链接  韩剧圈正版入口页面_韩剧圈官网登录链接  生成rdflib自定义SPARQL函数:参数匹配与实践指南  Kafka Streams中基于消息头条件过滤消息的实现指南 

搜索