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

参考资料与资源