C++ random库生成随机数

在C++11之前,生成随机数的方式主要是通过rand()函数,但这种方法存在许多不足,比如随机性不够、重复性高等问题。C++11引入了全新的<random>库,为生成随机数提供了更强大和灵活的支持。

1. <random>库的基本组成

C++11的<random>库包含以下几个主要组成部分:

  1. 随机数引擎:生成伪随机数的核心组件。
  2. 随机数分布:定义生成的随机数应该遵循的分布类型。
  3. 种子:用于初始化随机数引擎,确保生成的随机数序列的唯一性。

2. 随机数引擎

随机数引擎负责生成基础的随机数序列。常用的随机数引擎包括:

  • std::default_random_engine:默认的随机数引擎。
  • std::mt19937:Mersenne Twister引擎,生成高质量的伪随机数。
  • std::ranlux24_base:一种高质量的线性同余引擎。
  • std::knuth_b:基于Knuth算法的随机数引擎。

示例

#include <iostream>
#include <random>

int main() {
    // 使用默认随机数引擎
    std::default_random_engine generator;
    // 生成一个随机数
    int random_number = generator();
    std::cout << "Random number: " << random_number << std::endl;
    return 0;
}

3. 随机数分布

随机数分布决定了生成的随机数的分布方式。常用的分布包括:

  • 均匀分布std::uniform_int_distribution(整数均匀分布)、std::uniform_real_distribution(浮点数均匀分布)。
  • 正态分布std::normal_distribution
  • 伯努利分布std::bernoulli_distribution
  • 泊松分布std::poisson_distribution

示例:生成均匀分布的整数

#include <iostream>
#include <random>

int main() {
    std::random_device rd; // 用于获取真随机数种子
    std::mt19937 gen(rd()); // 使用Mersenne Twister引擎
    std::uniform_int_distribution<> dis(1, 100); // 定义均匀分布,范围1到100

    // 生成并打印10个随机数
    for (int n = 0; n < 10; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << std::endl;

    return 0;
}

示例:生成正态分布的浮点数

#include <iostream>
#include <random>

int main() {
    std::random_device rd; // 用于获取真随机数种子
    std::mt19937 gen(rd()); // 使用Mersenne Twister引擎
    std::normal_distribution<> dis(0, 1); // 定义正态分布,均值0,标准差1

    // 生成并打印10个随机数
    for (int n = 0; n < 10; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << std::endl;

    return 0;
}

4. 设置种子

种子是初始化随机数引擎的关键。不同的种子会生成不同的随机数序列。通常使用std::random_device生成一个真随机数来作为种子。

示例:使用固定种子

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(12345); // 使用固定种子12345
    std::default_random_engine gen((unsigned int)time(0));//随机种子

    std::uniform_int_distribution<> dis(1, 100);

    // 生成并打印10个随机数
    for (int n = 0; n < 10; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << std::endl;

    return 0;
}

5. 实用技巧

5.1 生成范围内的随机整数

使用std::uniform_int_distribution可以轻松生成指定范围内的随机整数:

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(10, 20); // 范围10到20

    std::cout << "Random number between 10 and 20: " << dis(gen) << std::endl;

    return 0;
}

5.2 生成范围内的随机浮点数

使用std::uniform_real_distribution可以生成指定范围内的随机浮点数:

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0.0, 1.0); // 范围0.0到1.0

    std::cout << "Random float between 0.0 and 1.0: " << dis(gen) << std::endl;

    return 0;
}

结论

C++11的<random>库提供了强大而灵活的随机数生成功能,通过组合不同的随机数引擎和分布,可以满足各种随机数生成需求。相比于传统的rand()函数,<random>库在生成随机数的质量和控制性上都有显著提升。

上一篇:Android之保存图片到相册之前兼容不同机型需要注意的配置


下一篇:检验周转率