C++如何生成随机数?C++ random库的使用方法【教程】


C++11推荐使用库生成随机数,以std::mt19937引擎配合std::uniform_int_distribution等分布对象实现高质量、均匀分布的随机数生成,避免rand()缺陷。

在C++中生成随机数,推荐使用C++11引入的库,它比老旧的rand()更可靠、更灵活、分布更均匀。

初始化随机数生成器(引擎)

随机数质量取决于引擎(engine)的选择和种子(seed)的设置。常用引擎是std::mt19937(梅森旋转算法),速度快且周期长。

  • 用当前时间作为种子:std::mt19937 gen{std::random_device{}()};
  • std::random_device是真正的硬件随机数源(在支持系统上),适合做种子
  • 避免固定种子(如gen.seed(42)),否则每次运行结果都一样

选择并配置分布(distribution)

引擎只产生“原始”整数,需要用分布对象把它映射成你想要的范围或类型:

  • 生成 [0, 9] 的整数:std::uniform_int_distribution dist(0, 9);
  • 生成 [1.0, 5.0) 的浮点数:std::uniform_real_distribution dist(1.0, 5.0);
  • 其他分布:正态std::normal_distribution、泊松std::poisson_distribution

生成并使用随机数

把引擎和分布组合调用即可:

std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution dice(1, 6);
int roll = dice(gen); // 掷一次骰子
  • 每次调用distribution(engine)返回一个新随机值
  • 引擎和分布建议复用,不要每次临时创建(影响性能和随机性)
  • 如果需要多个不同范围的随机数,可共用同一个引擎,搭配多个分布对象

常见误区提醒

别再用rand() % N!它有严重缺陷:

  • 低比特位随机性差,尤其当N不是2的幂时,分布不均
  • RAND_MAX通常只有32767,精度极低
  • srand(time(nullptr))在快速连续运行时可能重复种子
  • 完全规避这些问题,是现代C++的标准做法

基本上就这些。掌握引擎 + 分布的组合逻辑,就能安全、高效地生成各种随机数。


# c++  # int  # double  # 对象  # 算法  # 随机数  # 多个  # 推荐使用  # 就能  # 把它  # 高质量  # 再用  # 速度快  # 你想要  # 需要用 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件  Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  如何将文本文件中的竖排字符串转换为横排字符串  Win10系统怎么查看网络连接状态_Windows10网络和共享中心  如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧  如何外贸网站设计-能留住客户提升用户体验!  php删除数据怎么清空表_truncate与delete区别及用法【汇总】  c++中explicit(bool)的用法 c++条件性explicit【C++20】  Mac如何使用听写功能_Mac语音输入打字【效率技巧】  Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】  Win11怎么自动隐藏任务栏_Win11全屏显示设置【美化】  如何优化Golang内存分配与GC调度_Golang垃圾回收优化示例  Windows怎样关闭开始菜单广告_Windows关闭开始菜单广告设置【步骤】  MAC怎么在照片中添加水印_MAC自带编辑工具文字水印叠加【方法】  如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法  Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能  Win10如何备份注册表_Win10注册表备份步骤【攻略】  c++ namespace命名空间用法_c++避免命名冲突  Win10怎么更改用户名 Win10修改账户名称操作教程  如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例  Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】  Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】  PHP主流架构怎么集成Redis缓存_配置步骤【方法】  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】  PowerShell怎么创建复杂的XML结构  c++怎么用jemalloc c++替换默认内存分配器【性能】  Win10文件历史记录怎么用 Win10开启自动备份文件教程【防丢】  电脑的“网络和共享中心”去哪了_Windows 11新版网络设置指南【新手】  Windows如何使用注册表查找和删除项?(regedit教程)  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  php增删改查需要哪些扩展_开启mysqli或pdo扩展方法【说明】  php增删改查在php8里有什么变化_新特性对curd的影响【指南】  c++ std::future和std::promise c++线程间通信【教程】  Django密码修改后会话失效的解决方案  Python异步网络编程_aiohttp说明【指导】  如何使用Golang实现文件加密_Golang crypto 文件加密示例  如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例  Win11色盲模式怎么开_Win11屏幕颜色滤镜设置【关怀】  php打包exe后无法写入文件_权限问题解决方法【教程】  Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】  php错误怎么开启_display_errors与log_errors的设置【汇总】  Golang如何遍历目录文件_Golang filepath.Walk目录遍历操作方法  Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】  怎么将XML数据可视化 D3.js加载XML  Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查  Win11怎么禁用键盘自带键盘_Win11笔记本禁用内置键盘方法【教程】 

 2025-12-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.