C++ 随机数生成器
通过交互式代码示例学习如何在 C++ 中生成随机数。探索 rand()、srand()、<random> 库、std::uniform_int_distribution 和 std::mt19937 的详细用法。
C++ 代码编辑器
通过交互式代码示例学习如何在 C++ 中生成随机数。探索 rand()、srand()、<random> 库、std::uniform_int_distribution 和 std::mt19937 的详细用法。
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
输出
这是浏览器预览,不会执行 Java 或 C++;预览值不适合密码学用途。
预览示例
经典 C++ 使用 rand()
使用 <cstdlib> 中传统的 rand() 函数生成随机整数。简单且广泛支持,但由于随机性质量较差,不适合加密应用。
需要快速生成随机数?
试试我们的在线随机数生成器,无需编写代码即可获得即时结果。
理解 C++ 随机数生成
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
rand() Function
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
<random> Library
<random> 库(C++11+)提供现代随机数生成,包括 std::mt19937(梅森旋转算法)、各种分布(如 uniform_int_distribution),以及比 rand() 更好的随机性质量。
uniform_int_distribution
std::uniform_int_distribution 提供对整数范围的精确控制和均匀分布。非常适合统计应用、模拟以及需要精确范围控制的场景。
std::mt19937
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
常见用例
游戏和模拟
在游戏循环和模拟中使用 rand() 或现代 <random> 库生成随机骰子掷骰、抽卡、程序化生成和游戏事件。
安全和加密
rand() 和 std::mt19937 不适合密码学用途。安全敏感场景应使用有明确文档的密码学库或操作系统接口;std::random_device 不是跨平台的安全保证。
高性能计算
现代 <random> 库配合 std::mt19937 在高性能计算和科学计算应用中生成大量随机数时提供出色的性能。
软件测试
创建随机测试数据、模糊测试输入和边缘情况,确保 C++ 应用的健壮代码覆盖和错误检测。
C++ 随机数生成如何工作
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
std::random_device 依赖具体实现,也可能使用确定性引擎,不能保证每个平台的输出都不可预测。
实用建议
新代码避免使用 rand()
rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
明确选择种子
固定种子会复现同一引擎序列。C++ 引擎不会自动从系统熵初始化;需要时应明确选择种子。
使用适当的分布
对于均匀整数范围,使用 std::uniform_int_distribution。对于浮点数,使用 std::uniform_real_distribution。这确保了正确的统计特性。
技术规范
算法
- rand() 的算法由实现决定。C++11 随机库把 std::mt19937 等引擎与分布分开;分布并没有默认的 mt19937 引擎。
- 梅森旋转算法(std::mt19937)
- std::random_device 依赖具体实现,也可能使用确定性引擎,不能保证每个平台的输出都不可预测。
性能特征
- rand():快但随机性质量差
- <random>:快且质量优秀
- std::mt19937:生成大量时非常快
常见问题
涵盖了哪些 C++ 方法?
经典 rand() 与 srand()、现代 <random> 库、std::uniform_int_distribution 和 mt19937 引擎。
我可以定制示例吗?
可以。在参数面板中设置最小值、最大值和数量,然后运行以查看输出。
今天推荐哪种方法?
带有指定发行版和引擎的 <random> 库; rand() 在旧代码中仍然存在,但质量和范围缺陷较弱。
如何为生成器提供种子?
std::random_device 依赖具体实现,也可能使用确定性引擎,不能保证每个平台的输出都不可预测。
rand() 在 C++ 中返回的范围是什么?
rand() 返回 0 至 RAND_MAX,包含两端。请核对平台:Microsoft CRT 的上限是 32767,其他实现不一定相同。
rand() 具有密码学安全性吗?
rand() 和 std::mt19937 不适合密码学用途。安全敏感场景应使用有明确文档的密码学库或操作系统接口;std::random_device 不是跨平台的安全保证。
如何在 C++ 中生成随机浮点数?
将 std::mt19937 与针对所需区间(例如 0.0 到 1.0)配置的 std::uniform_real_distribution 结合使用,然后调用 dist(generator)。结果是一个 double 类型,包含下界但不包含上界。
rand() 在 C++ 中是线程安全的吗?
rand() 的线程安全性取决于实现。每个线程使用独立引擎,或对共享引擎的访问进行同步。
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
参考资料与资源
-
C++ <random> Reference - cppreference
C++ 官方伪随机数生成库参考文档。
-
Mersenne Twister - Wikipedia
多数语言随机库背后的 Mersenne Twister 算法。