C语言中生成正态分布随机数:randn函数实现与替代方案263


在C语言中,并没有直接内置的`randn`函数来生成符合标准正态分布(均值为0,方差为1)的随机数。`randn`函数通常是Matlab、Octave等数值计算软件中的内置函数。 然而,我们可以通过C语言的标准库函数结合一定的算法来实现类似的功能,生成服从近似标准正态分布的随机数。

本文将详细探讨如何在C语言中生成正态分布随机数,主要涉及以下几个方面:使用Box-Muller变换算法生成标准正态分布随机数,以及如何扩展到生成任意均值和方差的正态分布随机数。此外,还会讨论一些替代方案和需要注意的问题。

Box-Muller变换

Box-Muller变换是一种常用的从均匀分布的随机数生成正态分布随机数的算法。其核心思想是利用两个独立的均匀分布随机变量来生成两个独立的标准正态分布随机变量。算法如下:
生成两个独立的均匀分布随机数 `u1` 和 `u2`,取值范围为(0, 1)。可以使用C语言的标准库函数`rand()`结合`RAND_MAX`进行归一化:

#include
#include
#include
double u1 = (double)rand() / RAND_MAX;
double u2 = (double)rand() / RAND_MAX;

计算:

double R = sqrt(-2.0 * log(u1));
double theta = 2.0 * M_PI * u2;

生成两个独立的标准正态分布随机数 `z1` 和 `z2`:

double z1 = R * cos(theta);
double z2 = R * sin(theta);


这段代码中,`M_PI` 是定义在 `math.h` 头文件中的 π 值。 需要注意的是,`rand()` 函数生成的伪随机数序列的质量依赖于随机数生成器的种子。为了保证每次运行的结果不同,通常需要使用 `srand()` 函数设置种子,例如使用当前时间作为种子:
srand(time(NULL));

完整的代码示例如下:
#include
#include
#include
#include
double randn() {
double u1, u2, R, theta, z1;
u1 = (double)rand() / RAND_MAX;
u2 = (double)rand() / RAND_MAX;
if (u1

2025-04-05


上一篇:C语言printf输出等号:详解及进阶技巧

下一篇:C语言星号图案打印及“good”字样组合详解