C++11 引入了 <random> 库,这是一个功能强大的随机数生成库,用于生成各种类型的随机数。它比传统的 rand() 函数更加灵活、高效,并且可以生成高质量的随机数。以下是关于 C++ <random> 库的详细介绍,包括其核心概念和主要函数的使用方法。

1. 核心概念

C++ <random> 库主要由以下几部分组成:

  • 随机数引擎(Random Number Engine):用于生成随机数的底层机制。
  • 随机数分布(Random Number Distribution):用于将随机数引擎生成的随机数映射到特定的分布范围。
  • 随机数种子(Random Seed):用于初始化随机数引擎,以确保生成的随机数序列具有不同的起始点。
1.1 随机数引擎

随机数引擎是 <random> 库的核心部分,它负责生成伪随机数序列。C++ 提供了多种随机数引擎,每种引擎都有其特点和性能优势。常见的随机数引擎包括:

  • std::default_random_engine:默认的随机数引擎,通常用于简单的随机数生成。
  • std::linear_congruential_engine:线性同余引擎,通过线性同余公式生成随机数。
  • std::mersenne_twister_engine:梅森旋转算法引擎,生成高质量的随机数,性能较好。
  • std::subtract_with_carry_engine:带进位的减法引擎,适合需要高随机性的场景。
1.2 随机数分布

随机数分布用于将随机数引擎生成的随机数映射到特定的范围或分布形式。C++ 提供了多种分布类型,包括:

  • 均匀分布(Uniform Distribution)
    • std::uniform_int_distribution:生成均匀分布的整数。
    • std::uniform_real_distribution:生成均匀分布的浮点数。
  • 伯努利分布(Bernoulli Distribution)
    • std::bernoulli_distribution:生成布尔值,表示成功或失败的概率。
  • 离散分布(Discrete Distribution)
    • std::discrete_distribution:生成离散分布的整数,每个整数的生成概率可以指定。
  • 正态分布(Normal Distribution)
    • std::normal_distribution:生成正态分布的浮点数。
  • 指数分布(Exponential Distribution)
    • std::exponential_distribution:生成指数分布的浮点数。
  • 泊松分布(Poisson Distribution)
    • std::poisson_distribution:生成泊松分布的整数。
1.3 随机数种子

随机数种子用于初始化随机数引擎,以确保每次运行程序时生成的随机数序列不同。C++ 提供了多种方式来设置随机数种子:

  • std::random_device:一个非确定性随机数生成器,用于获取随机种子。
  • 手动设置种子:可以直接使用一个整数值作为种子。

2. 使用方法

以下是 <random> 库的使用方法,通过具体的代码示例来展示如何生成不同类型的随机数。

2.1 使用默认随机数引擎
#include <iostream>
#include <random>

int main() {
    std::default_random_engine engine; // 默认随机数引擎
    std::uniform_int_distribution<int> distribution(1, 10); // 生成 1 到 10 的均匀分布整数

    for (int i = 0; i < 10; ++i) {
        int random_number = distribution(engine); // 生成随机数
        std::cout << random_number << " ";
    }
    std::cout << std::endl;

    return 0;
}
2.2 使用梅森旋转算法引擎
#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(std::random_device{}()); // 使用随机设备初始化梅森旋转算法引擎
    std::uniform_real_distribution<double> distribution(0.0, 1.0); // 生成 0.0 到 1.0 的均匀分布浮点数

    for (int i = 0; i < 10; ++i) {
        double random_number = distribution(engine); // 生成随机数
        std::cout << random_number << " ";
    }
    std::cout << std::endl;

    return 0;
}
2.3 生成正态分布随机数
#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(std::random_device{}()); // 使用随机设备初始化引擎
    std::normal_distribution<double> distribution(5.0, 2.0); // 均值为 5.0,标准差为 2.0 的正态分布

    for (int i = 0; i < 10; ++i) {
        double random_number = distribution(engine); // 生成随机数
        std::cout << random_number << " ";
    }
    std::cout << std::endl;

    return 0;
}
2.4 生成泊松分布随机数
#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(std::random_device{}()); // 使用随机设备初始化引擎
    std::poisson_distribution<int> distribution(4.0); // 泊松分布,均值为 4.0

    for (int i = 0; i < 10; ++i) {
        int random_number = distribution(engine); // 生成随机数
        std::cout << random_number << " ";
    }
    std::cout << std::endl;

    return 0;
}
2.5 使用离散分布
#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(std::random_device{}()); // 使用随机设备初始化引擎
    std::discrete_distribution<int> distribution({40, 10, 10, 40}); // 离散分布,指定每个整数的生成概率

    for (int i = 0; i < 10; ++i) {
        int random_number = distribution(engine); // 生成随机数
        std::cout << random_number << " ";
    }
    std::cout << std::endl;

    return 0;
}

3. 总结

C++ <random> 库提供了一套功能强大且灵活的随机数生成机制。通过随机数引擎和随机数分布的组合,可以生成各种类型的随机数,满足不同的需求。使用 <random> 库时,建议使用高质量的随机数引擎(如梅森旋转算法引擎)和非确定性随机设备(std::random_device)来初始化种子,以确保生成的随机数序列具有良好的随机性和不可预测性。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐