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)),否则每次运行结果都一样引擎只产生“原始”整数,需要用分布对象把它映射成你想要的范围或类型:
std::uniform_int_distribution dist(0, 9);
std::uniform_real_distribution dist(1.0, 5.0);
std::normal_distribution、泊松std::poisson_distribution等把引擎和分布组合调用即可:
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++的标准做法基本上就这些。掌握引擎 + 分布的组合逻辑,就能安全、高效地生成各种随机数。