17370845950

C++如何生成随机数?C++ random库的使用方法【教程】
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_distribution dist(0, 9);
  • 生成 [1.0, 5.0) 的浮点数: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++的标准做法

基本上就这些。掌握引擎 + 分布的组合逻辑,就能安全、高效地生成各种随机数。