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() 函数(来自 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 及更高版本),优先使用
始终为 srand() 设置种子
如果使用 rand(),始终在程序开始时调用 srand(std::time(0)) 为生成器设置种子。否则,每次都会得到相同的序列。使用
使用适当的分布
对于均匀整数范围,使用 std::uniform_int_distribution。对于浮点数,使用 std::uniform_real_distribution。这确保了正确的统计特性。
技术规范
算法
- 线性同余生成器(rand 函数)
- 梅森旋转算法(std::mt19937)
- 特定平台熵源(std::random_device)
性能特征
- rand():快但随机性质量差
- <random>:快且质量优秀
- std::mt19937:生成大量时非常快