随机数 <random>

C++11 引入了 <random> 头文件,提供了强大的随机数生成器和分布函数,改进了之前的 rand() 函数,并提供了更多控制随机数生成的能力。以下是对 <random> 的主要组件和用法的介绍。

1. 随机数引擎

随机数引擎负责生成原始的伪随机数序列。C++ 标准库提供了多种引擎,以满足不同的需求。

常用随机数引擎

  • std::default_random_engine: 默认随机数引擎,通常基于标准库的实现。
  • std::mt19937: Mersenne Twister 引擎,具有较长的周期和较好的均匀性。
  • std::ranlux48: 基于 Lux 库的引擎,提供更高质量的随机数。
  • std::minstd_rand: 线性同余引擎,提供较简单的随机数生成。

示例: 使用随机数引擎

#include <iostream>
#include <random>

int main() {
    std::random_device rd; // 获取硬件随机数种子
    std::mt19937 gen(rd()); // 初始化 Mersenne Twister 引擎

    // 生成一个范围在 [0, 99] 的随机整数
    std::uniform_int_distribution<> dis(0, 99);

    std::cout << "Random number: " << dis(gen) << std::endl;
    return 0;
}

2. 随机数分布

随机数分布将生成的原始随机数映射到所需的范围或概率分布。C++ 标准库提供了多种常用的分布。

常用随机数分布

  • std::uniform_int_distribution: 均匀整数分布,用于生成指定范围内的整数。
  • std::uniform_real_distribution: 均匀实数分布,用于生成指定范围内的浮点数。
  • std::normal_distribution: 正态分布,用于生成符合正态分布的数值。
  • std::bernoulli_distribution: 伯努利分布,用于生成布尔值(成功或失败)。
  • std::exponential_distribution: 指数分布,用于生成符合指数分布的数值。
  • std::gamma_distribution: Gamma 分布,用于生成符合 Gamma 分布的数值。

示例: 使用随机数分布

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());

    // 生成均匀分布的浮点数
    std::uniform_real_distribution<> dis(0.0, 1.0);
    std::cout << "Uniform real number: " << dis(gen) << std::endl;

    // 生成正态分布的浮点数
    std::normal_distribution<> normal_dis(0.0, 1.0); // 均值为0,标准差为1
    std::cout << "Normal distributed number: " << normal_dis(gen) << std::endl;

    return 0;
}

3. 随机数种子

随机数种子用于初始化随机数引擎,以控制生成的随机数序列。使用相同的种子可以生成相同的随机数序列,这对于调试和测试非常有用。

示例: 设置随机数种子

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(42); // 使用固定种子初始化随机数引擎

    std::uniform_int_distribution<> dis(1, 10);
    std::cout << "Random number with fixed seed: " << dis(gen) << std::endl;

    return 0;
}

4. 随机数引擎与分布的组合

通常,随机数引擎和分布一起使用。引擎负责生成随机数序列,而分布决定生成的数值的分布特性。

示例: 引擎与分布组合

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());

    std::uniform_real_distribution<> uniform_dis(1.0, 10.0);
    std::normal_distribution<> normal_dis(5.0, 2.0);

    std::cout << "Uniform real number: " << uniform_dis(gen) << std::endl;
    std::cout << "Normal distributed number: " << normal_dis(gen) << std::endl;

    return 0;
}

5. 总结

C++ 的 <random> 头文件提供了一个灵活和强大的随机数生成框架。通过使用不同的随机数引擎和分布,程序员可以生成各种类型的随机数,满足不同的应用需求。<random> 的引入改善了随机数生成的质量和控制,适用于需要高质量随机数的应用场景,如模拟、测试和游戏开发等。