如何用C语言生成一个正态分布的样本

来源:百度知道 编辑:UC知道 时间:2024/05/16 05:00:15
例如,我给定期望和方差,如何生成一个正态分布的样本,样本数量最好由我给定.最好给出代码.
玉枫孤雨,27号你回答了我的生成正态分布的题.实际上这种方法是不对的,你这样做虽然生成了n个符合正态分布函数的数据,但这些数据并不一定是符合正态分布的,比如说对于N(0,1)分布,你程序的x是平均产生在-10000到+1000的,但N(0,1)分布在各点产生的概率并不相等.所以它们并不符合正态分布,不知道你理解了吗,你可能想的简单了,不过分数给你了.你再想想吧

调试程序时,随机数种子可以设常数,例如srand(54321);
用 rand() 产生均匀分布随机数 x1,x2
利用瑞利分布得正态分布随机数 y1,y2
再按要求线性缩放一下到[0.01,2] 区间。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
main(){
#define N 100
double rd[N];
double x1,x2,y1,y2;
double pi2=6.28318530728,mx,mi,ave=0;
int i;
//srand(54321);
srand(time(NULL));
for (i=0;i<=N-2;i=i+2){
x1=1.0*rand()/RAND_MAX;
x2=1.0*rand()/RAND_MAX;
y1= sqrt((-2.0*log(x1))) * cos(pi2*x2);
y2= sqrt((-2.0*log(x1))) * sin(pi2*x2);
rd[i]=y1;
rd[i+1]=y2;
}
mx=rd[0];mi=rd[0];
for (i=0;i<N;i++){
if (rd[i]>mx)mx=rd[i];
if (rd[i]<mi)mi=rd[i];
}
//printf("mi=%lf mx=%lf\n",mi,mx);
for (i=0;i<N;i++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01;
for (i=0;i<N-2;i=i+2) printf("%lf %lf\n",rd[i],rd[i+1]);
return 0;
}