Normally distributed pseudorandom numbers
目录:1.关于正太分布
2.正太分布随机数的产生
3.matlab中产生正太分布随机数的函数
一、什么是正太分布
正态分布(Normal distribution)是一种概率分布。正态分布是具有两个参数μ和σ^2的连续型随机变量的分布,第一参数μ是遵从正态分布的随机变量的均值,第二个参数σ^2是此随机变量的方差,所以正态分布记作N(μ,σ^2 )。遵从正态分布的随机变量的概率规律为取 μ邻近的值的概率大 ,而取离μ越远的值的概率越小;σ越小,分布越集中在μ附近,σ越大,分布越分散。
正态分布的密度函数的特点是:关于μ对称,在μ处达到最大值,在正(负)无穷远处取值为0,在μ±σ处有拐点。它的形状是中间高两边低 ,图像是一条位于x 轴上方的钟形曲线。当μ=0,σ^2 =1时,称为标准正态分布,记为N(0,1)。
对于正态分布,我们只需要知道三件事,1)它长什么样的就是下图,2)他的两个参数,平均数和标准差,3)对于这个图的解释是什么,也就是平均数周围的得分在总体上占到大多数(平均数上下1.96个标准差的得分占到95%的总体)
首先,假如我们拿一个省的人口进行身高测量,那么我们可以将所有人的平均数和标准差求出,假如平均数为1.70,标准差为0.05。我们发现在平均数附近的人特别多,比如说在1.70-1.96*0.05到1.70+1.96*0.05的人占到了总人数的95%,这个时候我们大概能够判断出这个省的身高服从正态分布。
当然这只是举例方便大家好理解,那要得出身高为正态分布的这个结论,必须将数据与正态分布的概率密度函数进行拟合。这里对于一般采用spss进行数据分析的人来说,大可不必去纠缠于这些算法。我们只需要知道正态分布有什么特点,如何利用正态分布的特点进行参数的估计。
实际上大多数的牵涉到很大样本的数据都被证明是正态分布的,比如体重,学习成绩等。拿学习成绩来说,中等得分的学生占大多数,非常拔尖的以及非常差的占很少的一部分,这就是正态分布的特点。
参考链接:http://jingyan.baidu.com/article/f54ae2fc2354a31e92b84934.html
二、正太分布随机数的产生
下面提出了一种已知概率密度函数的分布的随机数的产生方法,以典型的正态分布为例来说名任意分布的随机数的产生方法。
从图中可以看出,在μ附近的概率密度大,远离μ的地方概率密度小,我们要产生的随机数要服从这种分布,就是要使产生的随机数在μ附近的概率要大,远离μ处小,怎样保证这一点呢,可以采用如下的方法:在图中的大矩形中随机产生点,这些点是平均分布的,如果产生的点落在概率密度曲线的下方,则认为产生的点是符合要求的,将它们保留,如果在概率密度曲线的上方,则认为这些点不合格,将它们去处。如果随机产生了一大批在整个矩形中均匀分布的点,那么被保留下来的点的横坐标就服从了正态分布。可以设想,由于在μ处的f(x)的值比较大,理所当然的在μ附近的点个数要多,远离μ处的少,这从面积上就可以看出来。我们要产生的随机数就是这里的横坐标。
基于以上思想,我们可以用程序实现在一定范围内服从正态分布的随机数。程序如下:
double Normal(double x,double miu,double sigma) //概率密度函数
{
return 1.0/sqrt(2*PI*sigma) * exp(-1*(x-miu)*(x-miu)/(2*sigma*sigma));
}
double NormalRandom(double miu,
double sigma,double min,double max)//产生正态分布随机数
{
double x;
double dScope;
double y;
do
{
x = AverageRandom(min,max);
y = Normal(dResult, miu, sigma);
dScope = AverageRandom(0, Normal(miu,miu,sigma));
}while( dScope > y);
return x;
}
参数说明:double miu:μ,正态函数的数学期望
double sigma:σ,正态函数的均方差
double min,double max,表明产生的随机数的范围
参考链接:http://blog.sina.com.cn/s/blog_7f18a96b0100tpac.html
三、matlab中产生正太分布随机数的函数randn
randn:Normally distributed pseudorandom numbers.
R = randn(N) returns an N-by-N matrix containing pseudorandom values drawn from the standard normal distribution.
randn(M,N) or randn([M,N]) returns an M-by-N matrix.
randn(M,N,P,...) or randn([M,N,P,...]) returns an M-by-N-by-P-by-... array. randn returns a scalar. randn(SIZE(A)) returns an array the same size as A.
Note: The size inputs M, N, P, ... should be nonnegative integers.Negative integers are treated as 0.