C++如何生成随机数_C++ rand函数与C++11 random库的使用

C++中生成随机数推荐使用C++11 random库,因其随机性好、分布均匀且功能丰富;传统rand()函数虽简单但存在分布不均、随机性弱等缺点,适用于简单场景,新项目应优先选用random库。

在C++中生成随机数,主要有两种方式:使用传统的 rand() 函数和现代的 C++11 random 库。前者来自C语言标准库,简单但存在局限;后者功能更强大、分布更均匀,推荐在新项目中使用。

使用 rand() 函数生成随机数

rand()cstdlib 头文件中的函数,返回一个0到RAND_MAX之间的整数(通常为32767)。要生成指定范围内的随机数,常用取模运算。

注意:srand() 必须调用一次来设置种子,否则每次程序运行都会得到相同的“随机”序列。

示例代码:

#include
#include iostream>
#include

int main() {
    srand(static_cast(time(0))); // 以当前时间作为种子
    int random_num = rand() % 100; // 生成 0~99 的随机数
    std::cout     return 0;
}

缺点:

  • 随机数分布不均匀,尤其取模后低端值概率偏高
  • RAND_MAX 值较小,随机性有限
  • 线程安全性差
  • 缺乏对分布类型的支持(如正态分布)

使用 C++11 random 库(推荐)

C++11 引入了 头文件,提供了更灵活、高质量的随机数生成机制。核心由三部分组成:

  • 引擎(Engine):如 std::mt19937,梅森旋转算法,生成高质量伪随机数
  • 分布(Distribution):定义随机数的分布方式,如均匀分布、正态分布等
  • 种子生成器(可选):如 std::random_device,用于生成真随机种子

示例:生成 1~100 的均匀分布整数

#include stream>
#include

int main() {
    std::random_device rd; // 真随机种子源
    std::mt19937 gen(rd()); // 随机数引擎
    std::uniform_int_distribution dis(1, 100); // 分布范围 [1, 100]

    int random_num = dis(gen);
    std::cout     return 0;
}

支持多种分布类型:

  • std::uniform_real_distribution:生成浮点型均匀分布
  • std::normal_distribution:正态分布
  • std::bernoulli_distribution:伯努利分布(true/false)

如何选择?

如果只是写个小测试或学习用途,rand() 足够简单。但在实际开发、科学计算或需要高质量随机性的场景中,C++11 random 库是首选。它不仅提供更好的随机性,还能精确控制分布形态,代码也更清晰易读。

基本上就这些。新项目尽量用 random 库,老代码维护时注意 rand() 的坑。