C++ 随机数生成器

通过交互式代码示例学习如何在 C++ 中生成随机数。探索 rand()、srand()、<random> 库、std::uniform_int_distribution 和 std::mt19937 的详细用法。

多种方法 最佳实践 即时复制

需要快速生成随机数?

试试我们的在线随机数生成器,无需编写代码即可获得即时结果。

打开随机数生成器

C++ 代码编辑器

通过交互式代码示例学习如何在 C++ 中生成随机数。探索 rand()、srand()、<random> 库、std::uniform_int_distribution 和 std::mt19937 的详细用法。

输出

模拟输出(C++ 在服务器上运行)

点击"运行代码"查看示例输出

经典 C++ 使用 rand()

使用 <cstdlib> 中传统的 rand() 函数生成随机整数。简单且广泛支持,但由于随机性质量较差,不适合加密应用。

理解 C++ 随机数生成

C++ 提供了多种生成随机数的方法,从 C 语言中简单的 rand() 函数演进到 C++11 中现代的 <random> 库。经典的 rand() 使用线性同余生成器(LCG),并使用 srand() 进行种子初始化,而现代方法使用梅森旋转算法并提供各种分布类用于不同用例。

rand() Function

<cstdlib> 中经典的 rand() 函数提供简单的伪随机数生成。使用 srand() 进行种子初始化,它使用线性同余生成器(LCG)算法。适合基本应用但不适合加密用途。

<random> Library

<random> 库(C++11+)提供现代随机数生成,包括 std::mt19937(梅森旋转算法)、各种分布(如 uniform_int_distribution),以及比 rand() 更好的随机性质量。

uniform_int_distribution

std::uniform_int_distribution 提供对整数范围的精确控制和均匀分布。非常适合统计应用、模拟以及需要精确范围控制的场景。

std::mt19937

std::mt19937 实现梅森旋转算法,提供出色的统计特性和非常长的周期(2^19937-1)。它是大多数 <random> 分布的默认引擎。

常见用例

游戏和模拟

在游戏循环和模拟中使用 rand() 或现代 <random> 库生成随机骰子掷骰、抽卡、程序化生成和游戏事件。

安全和加密

对于安全应用,考虑使用专门的加密库。标准的 rand() 不是加密安全的。使用特定平台的安全随机数生成器生成密码和令牌。

高性能计算

现代 <random> 库配合 std::mt19937 在高性能计算和科学计算应用中生成大量随机数时提供出色的性能。

软件测试

创建随机测试数据、模糊测试输入和边缘情况,确保 C++ 应用的健壮代码覆盖和错误检测。

C++ 随机数生成如何工作

C++ 经典的 rand() 函数(来自 )使用线性同余生成器(LCG)算法。它使用公式 next = (a * current + c) % m 生成伪随机数。序列是确定性的,必须使用 srand() 进行种子初始化。

现代的 库(C++11+)使用梅森旋转算法(std::mt19937),提供更好的随机性质量和统计特性。它还提供各种分布类,如 uniform_int_distribution、normal_distribution 和 bernoulli_distribution 用于不同用例。

std::random_device 提供特定平台的熵源,用于为随机数引擎种子初始化,确保每次程序运行时产生不同的序列。

C++ 随机数生成专家技巧

🎯

新代码避免使用 rand()

对于新的 C++ 代码(C++11 及更高版本),优先使用 库而不是 rand()/srand()。它提供更好的随机性、更多的灵活性和线程安全的操作。

🔒

始终为 srand() 设置种子

如果使用 rand(),始终在程序开始时调用 srand(std::time(0)) 为生成器设置种子。否则,每次都会得到相同的序列。使用 时,种子初始化会自动处理。

使用适当的分布

对于均匀整数范围,使用 std::uniform_int_distribution。对于浮点数,使用 std::uniform_real_distribution。这确保了正确的统计特性。

技术规范

算法

  • 线性同余生成器(rand 函数)
  • 梅森旋转算法(std::mt19937)
  • 特定平台熵源(std::random_device)

性能特征

  • rand():快但随机性质量差
  • <random>:快且质量优秀
  • std::mt19937:生成大量时非常快