0

0

C++如何生成随机数?(库完整用法)

尼克

尼克

发布时间:2026-02-19 16:23:02

|

107人浏览过

|

来源于php中文网

原创

应使用 std::random_device 初始化 std::mt19937 种子,而非 time(nullptr);std::random_device 用于获取熵源但不宜直接生成随机数,正确写法为 std::random_device rd; std::mt19937 gen{rd()};

c++如何生成随机数?(库完整用法)

std::random_devicestd::mt19937 生成真随机种子

直接用 time(nullptr) 初始化随机数引擎,基本等于没随机——同一秒内多次运行结果完全一样。现代 C++ 要求用 std::random_device 获取熵源,再喂给确定性引擎(比如 std::mt19937)。

  • std::random_device 不保证在所有平台都返回真随机(Windows 上可能退化为伪随机),但它是最接近标准做法的起点
  • 别把它当随机数生成器直接用——它慢、调用次数有限制,只适合初始化一次种子
  • 常见错误:写成 std::mt19937 gen{std::random_device{}()};,这其实只取了一个 seed,正确做法是用它构造一个对象再调用 ()

推荐写法:

std::random_device rd;
std::mt19937 gen{rd()}; // 或者更稳一点:std::mt19937 gen{rd() ^ (rd() << 32)};

std::uniform_int_distributionstd::uniform_real_distribution 控制范围

C++11 以后,rand()RAND_MAX 是遗留方案,分布不均、范围窄、不可控。真正可控的随机必须搭配分布类(distribution)。

  • std::uniform_int_distribution<int></int> 生成闭区间 [a, b] 的整数,注意是包含两端的,不是 Python 那种左闭右开
  • std::uniform_real_distribution<double></double> 默认生成 [0.0, 1.0) 的浮点数;若要 [a, b),得显式传参:std::uniform_real_distribution<double> dis(a, b)</double>
  • 分布对象可复用,但不要跨线程共享——它内部有状态,且非线程安全
  • 别把分布和引擎绑死在一个表达式里,比如 dis(gen)() + 1 这种链式调用容易误读,拆开写更清晰

示例:生成 [1, 6] 的骰子点数

PHP的使用技巧集
PHP的使用技巧集

PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI或者Perl更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。下面介绍了十个PHP高级应用技巧。 1, 使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里

下载

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

std::uniform_int_distribution<int> dice(1, 6);
int roll = dice(gen); // 注意:不是 dice(gen())

为什么不能把引擎和分布定义成全局/静态变量?

看似省事,实则埋雷。全局随机引擎在多线程下会竞争修改内部状态,导致未定义行为;而静态分布对象如果模板参数不同(比如 intlong),编译器可能实例化多个副本,但你未必意识到。

  • 最稳妥的方式是:在需要的地方按需构造引擎(用局部 std::random_device 初始化),再绑定局部分布对象
  • 若性能敏感(比如高频循环中),可将 gendis 封装进类成员,确保单个实例独占一套状态
  • 切忌在头文件里定义 static inline std::mt19937 gen{...} —— 每个编译单元都会有一份,种子还可能重复

兼容旧代码时,rand() 的坑怎么绕?

有些老项目或第三方库依赖 rand(),强行替换风险高。这时可以临时桥接,但必须清楚代价:

  • rand() 只有 15 位有效精度(RAND_MAX 通常是 32767),远低于 std::mt19937 的 32 位输出
  • 它的默认分布严重偏向低位,rand() % N 会导致小数字概率偏高,尤其当 N 接近 RAND_MAX
  • 如果非要桥接,用 gen() 结果做掩码再模运算,比直接用 rand() 强:比如 (gen() & 0x7fff) % N
  • 但更推荐逐步替换:先封装一个 my_rand() 函数,内部用现代设施实现,再逐个替换调用点

事情说清了就结束。真要用好 C++ 随机数,核心就两条:种子别偷懒,分布别硬算。其他都是围绕这两条展开的细节。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

770

2023.08.02

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

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

574

2024.08.29

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

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

254

2025.08.29

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

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

210

2025.08.29

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

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

254

2025.08.29

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

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

105

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

675

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

366

2025.12.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

660

2026.02.13

热门下载

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

精品课程

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

共94课时 | 9.8万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.5万人学习

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

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