生成正态分布随机数-C语言

本文介绍了Box-Muller变换,一种使用均匀分布随机数生成标准正态分布随机变量的方法,通过C语言示例展示了其实现过程。

        Box-Muller变换是一种常用的生成服从标准正态分布(均值为0,标准差为1)随机变量的方法。其原理基于极坐标的思想,将由均匀分布产生的随机数转换为标准正态分布的随机数对。

Box-Muller变换的算法如下:

  1. 从区间(0, 1)内均匀地生成两个独立的随机数,记作 U_1​ 和 U_2
  2. 计算变量:

    Z_0 = \sqrt{-2\ln(U_1)}*\cos(2\pi*U_2)

    Z_1 = \sqrt{-2\ln(U_1)}*\sin(2\pi*U_2)

  3. Z_0​ 和 Z_1 即为符合标准正态分布的独立随机变量。

        这里的

### 如何使用C语言生成正态分布随机数 在C语言中,可以通过多种方法生成正态分布随机数。其中最常用的方法之一是 **Box-Muller 转换算法**,它通过两个独立的均匀分布随机数生成一对独立的标准正态分布随机数[^2]。 以下是基于 Box-Muller 方法的一个具体实现: #### 实现代码 ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> // 定义生成标准正态分布随机数的函数 double generate_normal(double mean, double stddev) { static int iset = 0; static double gset; double fac, rsq, v1, v2; if (iset == 0) { do { v1 = 2.0 * rand() / RAND_MAX - 1.0; // [-1, 1] v2 = 2.0 * rand() / RAND_MAX - 1.0; // [-1, 1] rsq = v1 * v1 + v2 * v2; } while (rsq >= 1.0 || rsq == 0); fac = sqrt(-2.0 * log(rsq) / rsq); gset = v1 * fac; iset = 1; return v2 * fac * stddev + mean; } else { iset = 0; return gset * stddev + mean; } } int main() { srand((unsigned) time(NULL)); // 初始化随机种子 double mean = 0.0; // 设置期望值 μ double stddev = 1.0; // 设置标准差 σ for (int i = 0; i < 10; i++) { printf("%.6f\n", generate_normal(mean, stddev)); } return 0; } ``` #### 代码说明 - `rand()` 函数用于生成随机数,范围为 `[0, RAND_MAX]`。 - 使用 `v1` 和 `v2` 表示二维平面上的一对随机向量分量,其模平方 (`rsq`) 需小于等于 1 才有效。 - 计算因子 `fac` 并应用 Box-Muller 公式完成转换。 - 返回的结果经过缩放和平移操作,使其具有指定的均值和方差[^3]。 --- 除了 Box-Muller 方法外,还可以采用其他技术如拒绝采样法(Rejection Sampling),这种方法的思想是在一个更大的矩形区域内随机抽样并剔除不符合条件的部分点[^5]。 无论哪种方式,都需要依赖高质量的基础随机数发生器以及精确的数学运算库支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值