C语言实现生成随机高斯分布(附带源码)
·
项目介绍
高斯分布(Gaussian Distribution),也被称为正态分布,是统计学中最常见的概率分布之一。在机器学习、信号处理、图像处理等领域,高斯分布常用于建模噪声、误差等。
在计算机科学中,生成高斯分布的随机数可以通过多种方法实现,其中最常用的是Box-Muller变换方法和Ziggurat算法。在这篇文章中,我们将使用Box-Muller变换来生成服从标准正态分布(均值为0,标准差为1)的随机数。
Box-Muller变换
Box-Muller变换是一种通过均匀分布的随机数生成高斯分布随机数的方法。假设我们有两个服从均匀分布的随机数 U1 和 U2,那么通过以下公式可以生成两个服从标准正态分布的随机数 Z1 和 Z2:

其中,U1 和 U2 是在区间 [0, 1] 上均匀分布的随机数。通过Box-Muller变换,我们能够通过均匀分布的随机数生成标准正态分布的随机数。
项目目标
- 实现Box-Muller变换:通过输入的均匀分布随机数生成高斯分布随机数。
- 输出结果:生成若干个高斯分布的随机数并输出。
实现思路
- 生成均匀分布的随机数:使用标准的C语言库函数
rand()生成均匀分布的随机数,利用其进行Box-Muller变换。 - Box-Muller变换:利用上面的公式,通过两个均匀分布的随机数生成两个标准正态分布的随机数。
- 结果输出:输出一组服从高斯分布的随机数。
C语言代码实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
// 生成一个[0,1]范围内的均匀分布随机数
double rand_uniform() {
return rand() / (RAND_MAX + 1.0);
}
// 使用Box-Muller变换生成一个高斯分布的随机数
double box_muller() {
double u1 = rand_uniform(); // 生成均匀分布的随机数 U1
double u2 = rand_uniform(); // 生成均匀分布的随机数 U2
double z1 = sqrt(-2 * log(u1)) * cos(2 * M_PI * u2); // 第一个高斯随机数
// double z2 = sqrt(-2 * log(u1)) * sin(2 * M_PI * u2); // 第二个高斯随机数,可以选择性使用
return z1; // 返回第一个高斯随机数
}
int main() {
int n;
// 设置随机种子,确保每次生成不同的随机数
srand(time(NULL));
// 输入生成高斯分布随机数的数量
printf("请输入生成的高斯分布随机数的个数: ");
scanf("%d", &n);
printf("生成的高斯分布随机数:\n");
for (int i = 0; i < n; i++) {
printf("%f ", box_muller());
}
printf("\n");
return 0;
}
程序解释
-
rand_uniform函数:- 该函数生成一个在区间 [0, 1] 上均匀分布的随机数。它使用
rand()函数生成一个整数,再将其归一化到 [0, 1] 区间。
- 该函数生成一个在区间 [0, 1] 上均匀分布的随机数。它使用
-
box_muller函数:- 该函数实现了Box-Muller变换。它从均匀分布中生成两个随机数 u1 和 u2,然后使用Box-Muller变换公式计算并返回一个服从标准正态分布(均值为0,标准差为1)的随机数。
- 你还可以选择生成第二个高斯随机数 z2,但在本示例中我们只返回 z1。
-
main函数:- 用户输入需要生成的高斯分布随机数的个数
n。 - 使用
box_muller函数生成随机数,并输出结果。
- 用户输入需要生成的高斯分布随机数的个数
-
srand(time(NULL)):- 用当前时间作为随机数生成的种子,以保证每次程序运行时都生成不同的随机数。
示例输入输出
示例 1
输入:
请输入生成的高斯分布随机数的个数: 10
输出:
生成的高斯分布随机数:
0.413738 0.127542 -1.056122 -1.267823 0.777139 -0.719982 1.302059 1.269623 0.563992 0.524708
总结
通过Box-Muller变换,我们能够根据均匀分布的随机数生成标准正态分布的随机数。在本程序中,我们使用了C语言的标准库函数生成均匀分布的随机数,并利用Box-Muller变换计算出高斯分布随机数。
该算法的优点是生成速度较快,且通过简单的数学公式实现,适用于需要生成大量高斯分布随机数的场景。如果需要生成具有特定均值和标准差的高斯分布随机数,只需对结果进行线性变换即可:

其中 μ 是均值,σ是标准差,Z 是标准正态分布随机数。
更多推荐


所有评论(0)