0

0

c++中如何生成随机数_c++产生随机数函数用法

冰火之心

冰火之心

发布时间:2026-01-07 14:43:02

|

937人浏览过

|

来源于php中文网

原创

现代C++推荐用std::random_device和std::mt19937替代rand():前者提供真随机种子,后者为高质量伪随机引擎;须用random_device初始化mt19937,配合uniform_int_distribution等分布对象生成指定范围的均匀随机数,避免取模破坏均匀性。

c++中如何生成随机数_c++产生随机数函数用法

std::random_devicestd::mt19937 生成高质量随机数

现代 C++ 推荐弃用 rand(),改用 `` 头文件中的引擎 + 分布组合。核心是:std::random_device 提供真随机种子(通常来自系统熵),std::mt19937 是高效、周期长的伪随机数引擎。

常见错误是直接用 std::mt19937{} 默认构造——它用固定种子,每次运行结果都一样。

  • 正确做法:用 std::random_device 初始化引擎,例如 std::mt19937 gen{std::random_device{}()}
  • std::mt19937 适合 32 位整数;若需 64 位,用 std::mt19937_64
  • 引擎对象应复用,不要每次生成一个新 gen,否则可能因构造开销或种子重复影响性能和随机性

std::uniform_int_distribution 生成指定范围整数

引擎只负责产出均匀分布的原始整数(如 uint32_t),要映射到自定义区间(比如 [1, 6] 模拟骰子),必须配合分布对象。直接对 gen() 结果取模(% 6 + 1)会破坏均匀性,尤其当范围不能整除引擎最大值时。

示例:生成 [10, 99] 的随机两位整数

立即学习C++免费学习笔记(深入)”;

Lovart
Lovart

全球首个AI设计智能体

下载
std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution dist(10, 99);
int x = dist(gen); // 每次调用都返回一个符合分布的 int
  • 分布对象可复用,且线程安全(只要引擎不共享)
  • 模板参数 int 必须与传入的上下界类型一致,否则编译失败
  • 闭区间语义:dist(a, b) 包含 ab 两个端点

为什么不用 rand()srand(time(nullptr))

rand() 是 C 风格遗留函数,存在多个硬伤:低序位随机性差、最大值由 RAND_MAX 限定(常为 32767)、无法指定分布、且 srand() 只能设一次种子——如果程序启动太快(比如被脚本快速连启多次),time(nullptr) 返回相同值,导致多进程生成完全相同的随机序列。

  • 即使加 usleep(1000) 或用 getpid() 混合,也无法解决底层算法缺陷
  • 在竞赛或加密场景中,rand() 生成的序列容易被预测,std::mt19937 则更可靠
  • 某些平台(如 macOS)的 rand() 实现甚至不是线性同余,但依然缺乏标准分布支持

生成浮点随机数:用 std::uniform_real_distribution

整数分布不能直接用于 floatdouble;必须显式选用实数分布。注意:它默认生成半开区间 [a, b),即包含 a,不包含 b。

示例:生成 [0.0, 1.0) 的 double

std::mt19937_64 gen{std::random_device{}()};
std::uniform_real_distribution dist(0.0, 1.0);
double d = dist(gen);
  • 若需要闭区间 [a, b],可改为 dist(a, std::nextafter(b, INFINITY)),但通常没必要
  • 对精度敏感场景(如蒙特卡洛模拟),优先用 double 分布而非 float,避免舍入偏差累积
  • 不要用 static_cast(rand()) / RAND_MAX,它分辨率极低且分布不均
C++11 之后的随机数设施设计清晰、可组合、可测试,但引擎和分布必须配对使用——漏掉任一环节(比如只声明引擎不声明分布,或反向操作)都会编译失败或逻辑错误。最易忽略的是:分布对象本身不保存状态,真正维持随机序列的是引擎;因此,若需重现某次运行的随机行为,只需保存并复用引擎的当前状态(通过 gen.seed() 或序列化其内部数组),而不是分布。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

554

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

97

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

529

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

193

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

97

2025.10.23

C++ 高性能计算与并行编程
C++ 高性能计算与并行编程

本专题专注于 C++ 在高性能计算(HPC)与并行编程中的应用,涵盖多线程、并发数据处理、OpenMP、MPI、GPU加速等技术。通过实际案例,帮助开发者掌握 如何利用 C++ 进行大规模数据计算和并行处理,提高程序的执行效率,适应高性能计算与数据密集型应用场景。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

好课诞生记
好课诞生记

共20课时 | 6万人学习

swift开发文档
swift开发文档

共33课时 | 18.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号