#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
const double PI = atan2(1.0 , 1.0) * 4;
/**********************************************
** 姓 名: 程炀
** 功 能:高斯分布
** 学 校: 西北工业大学
** 时 间: 2017.09.23
**********************************************/
//方法一:统计近视抽样法
double Gauss_Rand1(double mu,double sigma)
{
double z,r,sum;
sum = 0.0;
for(int i = 1;i <= 12;i++)
{
r = (double)rand() / RAND_MAX;
sum = sum + r;
}
z = (sum - 6.00) * sigma + mu;
return z;
}
//方法一:变换抽样法
double Gauss_Rand2(double mu,double sigma)
{
double r1,r2;
double z;
r1 = (double)rand() / RAND_MAX;
r2 = (double)rand() / RAND_MAX;
z = sqrt( -2 * log( r1 ) ) * cos( 2.0 * PI * r2) * sigma + mu;
return z;
}
int main()
{
double mu,sigma; //均值,标准差
double num; //产生数目
int numCount; //计数器,控制输出格式
mu = 0;
sigma = 1;
num = 100;
numCount = 0;
srand( (unsigned)time( NULL ) );
for (int i = 0; i < num; i++)
{
printf("%lf\t",Gauss_Rand1(mu,sigma));
if (++numCount % 5 == 0)
{
printf("\n");
}
}
printf("**************************************************************************\n");
numCount = 0;
for (int i = 0; i < num; i++)
{
printf("%lf\t",Gauss_Rand2(mu,sigma));
if (++numCount % 5 == 0)
{
printf("\n");
}
}
getchar();
return 0;
}
评论0