库生成高质量随机数 替代rand()【现代c++】">
直接用 std::random_device 配合 std::mt19937 和分布类(如 std::uniform_int_distribution),就能生成高质量、可重现、线程安全的随机数,彻底替代陈旧且有缺陷的 rand()。
rand() 是 C 风格遗留函数,存在多个硬伤:
效精度(RAND_MAX 常为 32767),远低于现代需求rand() % N 会引入严重偏差(模偏)这是现代 C++ 中最常用、平衡了质量、速度与易用性的方案:
std::random_device:真正的硬件熵源(在支持系统上),用于初始化种子,保证不可预测性std::mt19937(或 std::mt19937_64):Mersenne Twister 算法,周期长(2¹⁹⁹³⁷−1)、统计性质优秀、速度快std::uniform_int_distribution、std::normal_distribution):将均匀整数流映射为目标分布,数学上严格正确生成 [1, 100] 区间内的均匀随机整数:
#include#include int main() { // 1. 真实随机种子(仅用于一次初始化) std::random_device rd; // 2. 使用种子构造 Mersenne Twister 引擎 std::mt19937 gen(rd()); // 3. 定义整数均匀分布(闭区间 [1, 100]) std::uniform_int_distribution dist(1, 100); // 4. 生成随机数(可重复调用) for (int i = 0; i < 5; ++i) { std::cout << dist(gen) << '\n'; } }
注意:dist(gen) 是标准调用方式,引擎 gen 和分布 dist 应分别复用,不要每次重造。
实际项目中还需注意:
mt19937,例如 std::mt19937 gen(42);
gen 实例,避免共享状态;random_device 可全局共用std::mt19937_64 在 64 位平台通常更快;也可考虑 std::ranlux48(更高质量但更慢)random_device 当作随机数源频繁调用——它开销大,且某些平台(如 Windows MinGW)可能退化为伪随机