0

0

C++怎么使用随机数_C++随机生成教程【模拟】

尼克

尼克

发布时间:2026-03-14 03:25:14

|

390人浏览过

|

来源于php中文网

原创

推荐用 std::random_device 初始化 std::mt19937,因其平衡速度与质量;注意分布区间为左闭右闭,多线程应使用 thread_local 隔离实例,MinGW 下需检查 entropy 防伪随机降级。

c++怎么使用随机数_c++随机生成教程【模拟】

std::random_device 和 std::mt19937 怎么配对用

直接用 rand() 不安全,种子容易重复,生成序列可预测。现代 C++ 推荐用 std::random_device 当熵源,再喂给 std::mt19937(梅森旋转算法),这是目前最常用、平衡了速度和质量的组合。

  • std::random_device 不保证每次都返回真随机数(某些平台可能退化为伪随机),但它是唯一标准库中设计用来“初始化种子”的工具,别手写 time(nullptr) 塞给 mt19937
  • std::mt19937 是 32 位版本;需要 64 位请用 std::mt19937_64,两者接口一致,但分布范围和周期不同
  • 不要每次生成一个数都 new 一个 mt19937 对象——构造开销小,但反复初始化会浪费熵、还可能让 random_device 耗尽资源(尤其在嵌入式或容器环境)

示例:

std::random_device rd;
std::mt19937 gen(rd()); // 一次初始化就够了
std::uniform_int_distribution<int> dist(1, 6);
int roll = dist(gen); // 多次调用复用 gen

uniform_int_distribution 和 uniform_real_distribution 参数陷阱

这两个分布类控制输出范围,但闭合/开放区间容易搞反:它们都是左闭右闭(inclusive),即 dist(a, b) 可能返回 ab 本身。这点和 Python 的 random.randint 一致,但和 random.uniform 不同。

  • 整数场景:想要 [1, 6] 的骰子,写 uniform_int_distribution<int>(1, 6) 正确;若误写成 (0, 5),结果就偏移了
  • 浮点场景:想要 [0.0, 1.0) 半开区间(比如模拟概率阈值),不能用 uniform_real_distribution 直接写 (0.0, 1.0)——它会包含 1.0;得手动处理:double x = dist(gen); if (x == 1.0) x = 0.0;,或者改用 std::generate_canonical
  • 类型必须匹配:传 intuniform_real_distribution<double> 会编译失败,错误信息通常是 no matching function for call to ...

多线程下 rand() 和 std::mt19937 谁更危险

rand() 全局状态,多线程不加锁直接调用会导致数据竞争,结果不可预测,甚至 crash;std::mt19937 是对象实例,天然线程安全——只要每个线程用各自的 gen 对象。

  • 千万别在多个线程里共享同一个 std::mt19937 实例并并发调用;虽然不会崩溃,但会破坏随机性(内部状态被交叉修改)
  • 如果必须全局访问,用 thread_local 存储:thread_local std::mt19937 gen(std::random_device{}());,这样每个线程有独立副本,且只初始化一次
  • 注意 std::random_device 本身不是线程安全的,所以不要在多线程里反复用它构造新 gen

Windows 下 MinGW 和 MSVC 的 random_device 行为差异

MSVC 的 std::random_device 在较新版本(VS 2019+)已对接 Windows CryptGenRandom(即 BCryptGenRandom),是真随机;但 MinGW-w64 默认仍回退到伪随机(基于时间+PID),导致 rd() 每次返回相同种子。

阿里云AI平台
阿里云AI平台

阿里云AI平台

下载

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

  • 验证方法:打印几次 rd() 值,若全一样,说明被降级了
  • 临时绕过:用 rd.entropy() == 0.0 判断是否可用,不行就 fallback 到 std::chrono::steady_clock::now().time_since_epoch().count() 加上线程 ID 混淆
  • 长期建议:升级 MinGW-w64 到 11.0+ 并启用 -D_GLIBCXX_USE_CXX11_ABI=1,部分构建已支持硬件随机数

真随机源不可靠时,种子质量决定一切;别假设 random_device 在所有平台都“够用”。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

string转int
string转int

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

1031

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号