C++11推荐使用库生成随机数,以std::mt19937引擎配合std::uniform_int_distribution等分布对象实现高质量、均匀分布的随机数生成,避免rand()缺陷。

在C++中生成随机数,推荐使用C++11引入的库,它比老旧的rand()更可靠、更灵活、分布更均匀。
初始化随机数生成器(引擎)
随机数质量取决于引擎(engine)的选择和种子(seed)的设置。常用引擎是std::mt19937(梅森旋转算法),速度快且周期长。
- 用当前时间作为种子:
std::mt19937 gen{std::random_device{}()}; -
std::random_device是真正的硬件随机数源(在支持系统上),适合做种子 - 避免固定种子(如
gen.seed(42)),否则每次运行结果都一样
选择并配置分布(distribution)
引擎只产生“原始”整数,需要用分布对象把它映射成你想要的范围或类型:
- 生成 [0, 9] 的整数:
std::uniform_int_distributiondist(0, 9); - 生成 [1.0, 5.0) 的浮点数:
std::uniform_real_distributiondist(1.0, 5.0); - 其他分布:正态
std::normal_distribution、泊松std::poisson_distribution等
生成并使用随机数
把引擎和分布组合调用即可:
立即学习“C++免费学习笔记(深入)”;
std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution dice(1, 6);
int roll = dice(gen); // 掷一次骰子
- 每次调用
distribution(engine)返回一个新随机值 - 引擎和分布建议复用,不要每次临时创建(影响性能和随机性)
- 如果需要多个不同范围的随机数,可共用同一个引擎,搭配多个分布对象
常见误区提醒
别再用rand() % N!它有严重缺陷:
- 低比特位随机性差,尤其当
N不是2的幂时,分布不均 -
RAND_MAX通常只有32767,精度极低 -
srand(time(nullptr))在快速连续运行时可能重复种子 -
完全规避这些问题,是现代C++的标准做法
基本上就这些。掌握引擎 + 分布的组合逻辑,就能安全、高效地生成各种随机数。









