0

0

C++怎么产生随机数_C++生成指定范围随机数【重点】

冰火之心

冰火之心

发布时间:2026-03-14 12:04:31

|

158人浏览过

|

来源于php中文网

原创

应使用std::uniform_int_distribution配合引擎生成均匀整数随机数;rand()%N存在分布偏差且不跨平台;浮点分布默认左闭右开,需用nextafter包含右端点;多线程须为每线程独立引擎。

c++怎么产生随机数_c++生成指定范围随机数【重点】

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

直接用 rand() 取模会严重偏向小值,且不可控;C++11 起标准推荐用 std::uniform_int_distribution 配合引擎,才能真正均匀。

常见错误是只调用一次 std::random_device 初始化种子,却在循环里反复创建新分布对象——这不必要且可能影响性能。

  • 必须先创建一个引擎(如 std::mt19937),再用 std::random_device 给它喂种子
  • 分布对象(std::uniform_int_distribution<int>)可复用,传入引擎即可生成新数
  • 范围闭区间:构造时传 minmax,比如 dist(1, 6) 生成 1–6(含)
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(1, 100);
int x = dist(gen); // 每次调用都返回新随机数

为什么不能用 rand() % N + M

因为 rand() 返回值范围是 [0, RAND_MAX],而 RAND_MAX 很少是 N 的整数倍。取模后低区间的数概率更高——比如 RAND_MAX == 32767,要生成 [0,9],数字 0–7 出现概率略高于 8–9。

更糟的是:rand() 在很多旧 libc 实现中周期短、低位比特质量差,% 运算还放大了这个问题。

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

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载
  • Windows MSVC 的 RAND_MAX 是 32767,Linux glibc 通常是 2147483647,但行为不跨平台
  • srand(time(nullptr)) 在一秒内多次运行会得到相同种子,不适合快速重跑场景
  • 即使加了 srand,也无法修复分布偏差

std::uniform_real_distribution 生成浮点随机数

和整数分布类似,但注意:浮点分布默认是左闭右开区间 [a, b),不是闭区间。如果需要 [0.0, 1.0],得写成 dist(0.0, 1.0000001) 或手动处理边界——更稳妥的做法是用 std::nextafter

  • 常用类型是 floatdouble,模板参数需显式指定
  • 生成 [0.0, 1.0) 直接用 std::uniform_real_distribution<double>(0.0, 1.0)
  • 若真要包含 1.0,可用 std::uniform_real_distribution<double>(0.0, std::nextafter(1.0, 2.0))
std::uniform_real_distribution<double> d(0.0, 1.0);
double r = d(gen); // r ∈ [0.0, 1.0)

多线程下别共享同一个 std::mt19937 引擎

std::mt19937 不是线程安全的:并发调用 operator() 可能破坏内部状态,导致重复序列或崩溃。这不是“大概率出错”,而是未定义行为。

  • 每个线程应持有独立引擎实例(可同用一个 std::random_device 种子,但建议用不同 seed,比如加线程 ID 哈希)
  • 不要把引擎放在全局或静态变量里供多线程轮着用
  • 若必须集中管理,用 thread_local 存储引擎,或改用无状态的随机函数(如 PCG)

容易被忽略的一点:即使你没显式开线程,用了 async / future / OpenMP,也可能触发并发访问。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

595

2024.04.28

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

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

108

2025.10.23

string转int
string转int

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

1051

2023.08.02

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

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

614

2024.08.29

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

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

335

2025.08.29

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

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

235

2025.08.29

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

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

335

2025.08.29

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

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

108

2025.10.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共94课时 | 11.3万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.7万人学习

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

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