random
std::random 是 C++11 引入的真随机数库,替代了 C 风格 rand()。它把随机数生成拆成引擎(生成原始随机位)和分布(映射到目标范围),两者可自由组合。
头文件与基本用法
#include <random>
#include <iostream>
int main() {
std::random_device rd; // 真随机熵源(种子)
std::mt19937 gen(rd()); // 梅森旋转引擎
std::uniform_int_distribution<int> dist(1, 6); // [1, 6] 均匀分布
for (int i = 0; i < 10; ++i) {
std::cout << dist(gen) << ' ';
}
// 输出 10 个 1~6 之间的随机整数
return 0;
}
核心组件
| 组件 | 作用 | 示例 |
|---|---|---|
| 熵源 | 提供不可预测的种子 | std::random_device |
| 引擎 | 生成随机位序列 | std::mt19937, std::default_random_engine |
| 分布 | 将随机位映射为目标分布 | uniform_int_distribution, normal_distribution |
常用分布
| 分布 | 用途 |
|---|---|
uniform_int_distribution | 整数均匀分布 |
uniform_real_distribution | 浮点均匀分布 |
normal_distribution | 正态分布(高斯) |
bernoulli_distribution | 伯努利(true/false) |
使用注意
- 不要再使用
rand()+srand(),随机质量差且线程不安全。 - 引擎的构造开销不小,避免每次调用都重新创建。
random_device在某些平台可能退化为伪随机,关键安全场景需验证。- 并发使用时,每个线程应有独立的引擎实例或加锁保护。
小结
<random> 用"引擎 + 分布"的分离设计提供了高质量随机数。日常最常用的是 random_device 作种子 + mt19937 作引擎 + uniform_*_distribution 作分布。