一般有两种算法:
算法一产生12个(0,1)平均分布的随机函数,用大数定理可以模拟出正态分布。
算法二用到了数学中的雅可比变换,直接生成正态分布,但此算法在计算很大规模的数时
会出现溢出错误。
测试程序:
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
double _sta(double mu,double sigma)
{
int i;
double r,sum=0.0;
if(sigma<=0.0) { printf("Sigma<=0.0 in _sta!"); exit(1); }
for(i=1;i<=12;i++)
sum = sum + _random();
r=(sum-6.00)*sigma+mu;
return r;
}
double _sta2(double mu,double sigma)
{
double r1,r2;
r1=_random();
r2=_random();
return sqrt(-2*log(r1))*cos(2*M_PI*r2)*sigma+mu ;
}
int main()
{
int i;
double mu,sigma;
srand( (unsigned)time( NULL ) );
mu=0.0;
sigma=1.0;
printf("Algorithm 1:\n");
for(i=0;i<10;i++)
printf("%lf\t",_sta(mu,sigma));
printf("Algorithm 2:\n");
for(i=0;i<10;i++)
printf("%lf\t",_sta2(mu,sigma));
return 0;
}
//由均匀分布的随机数得到正态分布的随机数
#include <math.h>
float gasdev(idum)
int *idum;
{
static int iset=0;
static float gset;
float fac,r,v1,v2;
float ran1();//产生均匀分布的随机数,可利用系统函数改写
if (iset == 0) {
do {
v1=2.0*ran1(idum)-1.0;
v2=2.0*ran1(idum)-1.0;
r=v1*v1+v2*v2;
} while (r >= 1.0);
fac=sqrt(-2.0*log(r)/r);
gset=v1*fac;
iset=1;
return v2*fac;
} else {
iset=0;
return gset;
}
}
原理可找本数值算法方面的书看看。
4
邓凌佳
- 粉丝: 79
- 资源: 1万+
最新资源
- 基于django+mysql的商品推荐系统全部资料+详细文档+高分项目.zip
- 基于django-wechat-base的微信信息管理模块全部资料+详细文档+高分项目.zip
- 基于django-xadmin的idc资产管理应用全部资料+详细文档+高分项目.zip
- 基于Django带支付宝支付电商购物商城网站设计毕业源码案例设计全部资料+详细文档+高分项目.zip
- 基于django的电影票比价网全部资料+详细文档+高分项目.zip
- 基于django的简单的cms系统全部资料+详细文档+高分项目.zip
- 基于Django的任务管理追踪平台全部资料+详细文档+高分项目.zip
- 基于Flask+Yolov5+Redis的深度学习在线监测网站详细文档+全部资料+高分项目.zip
- 基于flask-socketio的一个在线答题详细文档+全部资料+高分项目.zip
- 基于flask的后端敏捷开发框架详细文档+全部资料+高分项目.zip
- 基于flask的51商城应用系统设计详细文档+全部资料+高分项目.zip
- 基于flask的记账管理系统后端详细文档+全部资料+高分项目.zip
- 基于flask的人力资源管理系统详细文档+全部资料+高分项目.zip
- 基于flask的企业级开发模板,集成了flask-socketio,mongodb等等详细文档+全部资料+高分项目.zip
- 基于flask的随机故事网站详细文档+全部资料+高分项目.zip
- 基于Django的视频弹幕双创性教育网站:伊甸园的烦恼全部资料+详细文档+高分项目.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈