在 C++ 中,你可以使用 <random>
头文件中的分布器类来实现各种类型的随机数分布。常见的分布器包括均匀分布、正态分布、泊松分布等。这些分布器可以生成符合特定分布规律的随机数序列,以满足不同的应用需求。
下面是一些常见的随机数分布器及其简要介绍:
-
std::uniform_int_distribution:
生成均匀分布的整数随机数,即在指定的范围内,每个整数值出现的概率相等。 -
std::uniform_real_distribution:
生成均匀分布的浮点数随机数,即在指定的范围内,每个浮点数值出现的概率相等。 -
std::normal_distribution:
生成正态分布的随机数,即按照正态分布的规律生成的随机数序列,可以通过指定均值和标准差来调整分布的形状。 -
std::poisson_distribution:
生成泊松分布的随机数,适用于描述单位时间内事件发生的次数,可以通过指定平均发生率来调整分布的形状。 -
std::binomial_distribution:
生成二项分布的随机数,适用于描述一系列独立重复的是/非事件,可以通过指定试验次数和成功概率来调整分布的形状。 -
std::discrete_distribution:
生成离散分布的随机数,即按照指定的离散概率分布生成的随机数序列,可以根据给定的概率分布来生成随机数。
1. 正态分布示例:
#include <iostream>
#include <random>
int main() {
// 创建一个 random_device 对象用于生成随机种子
std::random_device rd;
// 使用随机种子初始化一个默认随机数引擎
std::mt19937 gen(rd());
// 创建一个正态分布的随机数分布器,均值为 50,标准差为 10
std::normal_distribution<double> dis(50.0, 10.0);
// 生成随机数并输出
for (int i = 0; i < 10; ++i) {
double random_num = dis(gen);
std::cout << "Random number: " << random_num << std::endl;
}
return 0;
}
2. 泊松分布示例:
#include <iostream>
#include <random>
int main() {
// 创建一个 random_device 对象用于生成随机种子
std::random_device rd;
// 使用随机种子初始化一个默认随机数引擎
std::mt19937 gen(rd());
// 创建一个泊松分布的随机数分布器,平均发生率为 5
std::poisson_distribution<int> dis(5);
// 生成随机数并输出
for (int i = 0; i < 10; ++i) {
int random_num = dis(gen);
std::cout << "Random number: " << random_num << std::endl;
}
return 0;
}
3. 均匀分布
#include <iostream>
#include <random>
int main() {
// 创建一个 random_device 对象用于生成随机种子
std::random_device rd;
// 使用随机种子初始化一个默认随机数引擎
std::mt19937 gen(rd());
// 创建一个均匀分布的整数随机数分布器,范围是 [min, max]
int min = 1;
int max = 100;
std::uniform_int_distribution<int> dis(min, max);
// 生成随机数并输出
for (int i = 0; i < 10; ++i) {
int random_num = dis(gen);
std::cout << "Random number: " << random_num << std::endl;
}
return 0;
}
4. 二项分布
#include <iostream>
#include <random>
int main() {
// 创建一个 random_device 对象用于生成随机种子
std::random_device rd;
// 使用随机种子初始化一个默认随机数引擎
std::mt19937 gen(rd());
// 设置二项分布的参数
int n = 10; // 试验次数
double p = 0.5; // 每次试验成功的概率
// 创建一个二项分布的随机数分布器
std::binomial_distribution<int> dis(n, p);
// 生成随机数并输出
for (int i = 0; i < 10; ++i) {
int random_num = dis(gen);
std::cout << "Random number: " << random_num << std::endl;
}
return 0;
}
5. 生成均匀分布的实数随机数
std::uniform_real_distribution
是 C++ 标准库中的一个随机数分布器类,用于生成均匀分布的实数随机数。其使用方法与 std::uniform_int_distribution
类似,不同之处在于它生成的是浮点数而不是整数。该分布器生成的随机数范围是半开区间 [a,b)[a,b),其中 aa 是最小值,bb 是最大值。
#include <iostream>
#include <random>
int main() {
// 创建一个 random_device 对象用于生成随机种子
std::random_device rd;
// 使用随机种子初始化一个默认随机数引擎
std::mt19937 gen(rd());
// 设置均匀分布的参数
double min = 0.0;
double max = 1.0;
// 创建一个均匀分布的实数随机数分布器,范围是 [min, max)
std::uniform_real_distribution<double> dis(min, max);
// 生成随机数并输出
for (int i = 0; i < 10; ++i) {
double random_num = dis(gen);
std::cout << "Random number: " << random_num << std::endl;
}
return 0;
}