使用 random 头文件生成随机数
使用现代引擎和分布生成高质量的随机数
使用 random 头文件生成随机数 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。
为什么不使用 rand()?
传统的 C std::rand() 使用全局状态,统计质量较差,而且不是线程安全的。现代 C++ 在 <random> 中提供了好得多的工具。
三部分配方
现代 C++ 中的随机数由三个部分组成:
- 一个种子来源(真正的熵)
- 一个生成器引擎(确定性状态)
- 一个分布(调整输出)
使用 random_device 生成种子
std::random_device 从 OS 中获取真实熵,但这可能很慢。请使用它一次,为快速引擎生成种子。
#include <random>
std::random_device rd;
std::mt19937 engine(rd());mt19937 引擎
std::mt19937(梅森旋转算法)是一种快速的伪随机引擎,具有出色的统计质量。它是大多数应用的默认选择。
均匀整数分布
在闭区间内生成服从均匀分布的整数。
std::uniform_int_distribution<int> dice(1, 6);
int roll = dice(engine);均匀实数分布
用于生成半开区间 [a, b) 内的浮点数。
std::uniform_real_distribution<double> dist(0.0, 1.0);
double x = dist(engine);正态(高斯)分布
用于生成钟形曲线分布的随机数,常见于模拟和机器学习。
std::normal_distribution<double> norm(0.0, 1.0); // mean 0, stddev 1
double x = norm(engine);其他分布
该库还包含许多其他分布:bernoulli_distribution、poisson_distribution、exponential_distribution、discrete_distribution 等。
可复现的随机性
进行测试时,请使用固定值作为种子,以便每次运行都获得相同的序列。
std::mt19937 engine(42);
// Same output every time you run the program随机打乱
使用 std::shuffle 打乱容器,该函数可以接受任意引擎。
#include <algorithm>
std::vector<int> v = {1,2,3,4,5};
std::shuffle(v.begin(), v.end(), engine);陷阱:在循环中重新生成种子
不要为每个随机数都创建新的 random_device 或引擎。请构造一个引擎,并在多次调用之间重复使用它。
快速检查
在现代 C++ 中,为伪随机引擎生成种子的最安全方式是什么?
回顾
现代 C++ 使用 random_device 生成种子,使用 mt19937 作为引擎,并使用 uniform_int_distribution 等分布来调整输出。请重复使用引擎,不要为每次调用都创建一个新引擎。
常见问题解答
「使用 random 头文件生成随机数」课时是免费的吗?
是的 — 「使用 random 头文件生成随机数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。
「使用 random 头文件生成随机数」这节课中我会学到什么?
使用现代引擎和分布生成高质量的随机数 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C++ Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 random 头文件生成随机数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C++ Academy 课中编写并运行代码吗?
能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 整数类型与浮点类型
- cmath 头文件:pow、sqrt、abs、round
- 使用 random 头文件生成随机数
- 数值限制与溢出行为