高斯分布公式

正态分布的随机数发生器 in C# 
主要参考《Numerical Recipes in C++ 2/e》p.292~p.294 和《Simulation Modeling and Analysis 
3/e》p.465~p.466。

Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法。设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立。令

X1 = sqrt(-2*log(U1)) * cos(2*PI*U2);
X2 = sqrt(-2*log(U1)) * sin(2*PI*U2);

那么 X1, X2 服从 N(0,1) 分布,且相互独立。等于说我们用两个独立的 U(0,1) 随机数得到了两个独立的 N(0,1)随机数。


首先,高斯随机数有如下特征,均值为0,方差为1。这个相对于标准分布的随机数来说的, 
简单的说他们之间的区别只是随机数在区间内产生的概率不同。具体要说那个 
区域概率大,那个区域概率小,翻翻概率的教材吧,上面有标准分布的图像, 
至于gauss的概率分布图像,我想网上也能找到,或者数学教材上。
给你一个 Knuth首创并被大家认可的一个产生高斯随机数列的代码:

#include <stdlib.h>
#include <math.h> 
double gaussrand() 

static double V1, V2, S; 
static int phase = 0; 
double X;

if(phase == 0)

do
{

double U1 = (double)rand() / RAND_MAX; 
double U2 = (double)rand() / RAND_MAX;

V1 = 2 * U1 - 1; 
V2 = 2 * U2 - 1; 
S = V1 * V1 + V2 * V2; 
}
while(S > = 1 || S == 0);

X = V1 * sqrt(-2 * log(S) / S); 
}
else 
X = V2 * sqrt(-2 * log(S) / S);

phase = 1 - phase;

return X; 
}

以上代码是基于Box-Muller方法,基本思想是生成两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准常态分布随机变量X和Y:

 X = \sqrt{- 2 \ln U} \, \cos(2 \pi V) ,
 Y = \sqrt{- 2 \ln U} \, \sin(2 \pi V)
这个方程的提出是因为二自由度的 卡方分布 (见性质4)很容易由指数随机变量(方程中的lnU)生成。因而通过随机变量V可以选择一个均匀环绕圆圈的角度,用指数分布选择半径然后变换成(正态分布的)x,y坐标。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值