<random> 是 C++ 标准库中的一个头文件,用于提供随机数生成的功能。它允许开发者生成不同类型的随机数,并提供了广泛的随机数分布选择(如均匀分布、正态分布等),适用于各种场景,包括模拟、加密、游戏开发等。


目录

  1. 简介
  2. 随机数生成器
  3. 随机数分布
  4. 随机数生成示例
  5. 结论

1. 简介

C++ 的 <random> 库为随机数生成提供了一个灵活且强大的接口。与传统的 rand() 函数不同,<random> 提供了更高质量的随机数生成器,支持多种类型的随机数分布,可以确保在多线程和高性能要求下的应用程序中生成真正的随机数据。

包含头文件:

1
#include <random>

2. 随机数生成器

C++ 的随机数生成器基于所谓的伪随机数生成器(PRNG),这些生成器通过某种算法生成伪随机数序列。<random> 库提供了多种随机数生成器,每种生成器有不同的特性和用途。

2.1 std::default_random_engine

std::default_random_engine 是一个默认的伪随机数生成器,它根据特定的算法生成随机数。它不一定是最强大的生成器,但对于大多数应用场景已经足够。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <random>
 
int main() {
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1, 100);  // 生成 1 到 100 之间的随机整数
 
    int random_number = distribution(generator);
    std::cout << "Random number: " << random_number << std::endl;
 
    return 0;
}

2.2 std::mt19937

std::mt19937 是一种基于梅森旋转算法(Mersenne Twister)的随机数生成器,具有非常好的随机性和速度,广泛应用于各种需求较高的场景,如科学计算和模拟。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <random>
 
int main() {
    std::mt19937 generator;  // Mersenne Twister 随机数生成器
    std::uniform_int_distribution<int> distribution(1, 100);  // 生成 1 到 100 之间的随机整数
 
    int random_number = distribution(generator);
    std::cout << "Random number: " << random_number << std::endl;
 
    return 0;
}

3. 随机数分布

C++ <random> 库提供了多种分布,允许开发者根据需要生成不同类型的随机数。例如,均匀分布、正态分布、伯努利分布等。每个分布都有一个对应的类,用来生成特定的随机数。

3.1 std::uniform_int_distribution

std::uniform_int_distribution 生成范围内均匀分布的整数随机数。这意味着每个整数值在给定范围内的概率是相同的。

语法:

1
std::uniform_int_distribution<int> distribution(min, max);

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <random>
 
int main() {
    std::mt19937 generator;
    std::uniform_int_distribution<int> distribution(1, 6);  // 生成 1 到 6 之间的整数
 
    for (int i = 0; i < 10; ++i) {
        std::cout << distribution(generator) << " ";  // 模拟掷骰子
    }
    std::cout << std::endl;
 
    return 0;
}

3.2 std::uniform_real_distribution

std::uniform_real_distribution 生成均匀分布的浮动数。它返回的浮动数值在给定范围内每个值的概率相等。

语法:

1
std::uniform_real_distribution<double> distribution(min, max);

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <random>
 
int main() {
    std::mt19937 generator;
    std::uniform_real_distribution<double> distribution(0.0, 1.0);  // 生成 [0.0, 1.0) 之间的浮动数
 
    for (int i = 0; i < 10; ++i) {
        std::cout << distribution(generator) << " ";
    }
    std::cout << std::endl;
 
    return 0;
}

3.3 std::normal_distribution

std::normal_distribution 用于生成符合正态分布(即高斯分布)的随机数。生成的随机数具有均值和标准差,符合“钟形曲线”的分布。

语法:

1
std::normal_distribution<double> distribution(mean, stddev);

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <random>
 
int main() {
    std::mt19937 generator;
    std::normal_distribution<double> distribution(0.0, 1.0);  // 生成均值为 0,标准差为 1 的正态分布数
 
    for (int i = 0; i < 10; ++i) {
        std::cout << distribution(generator) << " ";
    }
    std::cout << std::endl;
 
    return 0;
}

4. 随机数生成示例

以下是一个完整的示例,展示如何结合 std::mt19937 随机数生成器和不同的分布生成不同类型的随机数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <random>
 
int main() {
    // 初始化生成器
    std::mt19937 generator;
 
    // 均匀分布
    std::uniform_int_distribution<int> uniform_int(1, 10);
    std::uniform_real_distribution<double> uniform_real(0.0, 1.0);
 
    // 正态分布
    std::normal_distribution<double> normal_dist(0.0, 1.0);
 
    // 生成随机数
    std::cout << "Uniform Integer: " << uniform_int(generator) << std::endl;
    std::cout << "Uniform Real: " << uniform_real(generator) << std::endl;
    std::cout << "Normal Distribution: " << normal_dist(generator) << std::endl;
 
    return 0;
}

输出:

1
2
3
Uniform Integer: 3
Uniform Real: 0.567938
Normal Distribution: -0.0136819

5. 结论

<random> 库是 C++ 中非常强大的一个工具,用于生成各种类型的随机数。相比传统的 rand()<random> 提供了更高质量的随机数生成方式,并支持丰富的分布选择。通过合理选择不同的随机数生成器和分布,可以实现更加灵活和高效的随机数生成,适用于科学计算、模拟、游戏开发等多种场景。

推荐阅读: