四种分布 随机数拟合C+MATLAB.docx

上传人:b****4 文档编号:5213528 上传时间:2022-12-14 格式:DOCX 页数:14 大小:164.08KB
下载 相关 举报
四种分布 随机数拟合C+MATLAB.docx_第1页
第1页 / 共14页
四种分布 随机数拟合C+MATLAB.docx_第2页
第2页 / 共14页
四种分布 随机数拟合C+MATLAB.docx_第3页
第3页 / 共14页
四种分布 随机数拟合C+MATLAB.docx_第4页
第4页 / 共14页
四种分布 随机数拟合C+MATLAB.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

四种分布 随机数拟合C+MATLAB.docx

《四种分布 随机数拟合C+MATLAB.docx》由会员分享,可在线阅读,更多相关《四种分布 随机数拟合C+MATLAB.docx(14页珍藏版)》请在冰豆网上搜索。

四种分布 随机数拟合C+MATLAB.docx

四种分布随机数拟合C+MATLAB

四种函数的拟合

1正态分布

#include

//#include"iomanip.h"

#include"iomanip"

#include

#include

usingnamespacestd;

constintA=2045;

constintC=1;

constintM=1048576;//2的20次方

doublejunyun(doublea,doubleb,longint*seed)//采取的方法是混合同余法其中A,C,M都是自定义的常数

{

doublet;

*seed=A*(*seed)+C;

*seed=(*seed)%M;

t=(*seed)/(double)M;

t=a+(b-a)*t;

returnt;

}

doublegauss(doublemean,doublesigma,longint*s)

{

inti;

doublex,y;

for(x=0,i=0;i<12;i++)

x+=junyun(0.0,1.0,s);

x=x-6.0;

y=mean+x*sigma;

returny;

}

intmain()

{

inti,j,num;

doublex,mean,sigma;

longints;

cout<<"输入均值和方差的值"<

cin>>mean>>sigma;

cout<<"输入随机种子:

"<

cin>>s;

cout<<"输入生成随机数个数:

"<

cin>>num;

ofstreamcout("zhengtai.txt");

for(i=0;i

{

x=gauss(mean,sigma,&s);

cout<

cout<<"";

}

return0;

运行程序:

}

正态分布拟合图

2均匀分布

#include

#include

#include

#include

#include

#include

//#include"graphics.h"

floata,b,c;

intn,type;

floatnextGaussian(floata,floatb)

{

floatv0,v1,v2,s;

floatnextNextGaussian;

//inthaveNextNextGaussian=0;

do

{do

{

v1=2*(((float)rand()/RAND_MAX))-1;//between-1.0and1.0

v2=2*(((float)rand()/RAND_MAX))-1;//between-1.0and1.0

s=v1*v1+v2*v2;

}while(s>=1||s==0);

floatmultiplier=float(sqrt(-2*log(s)/s));

nextNextGaussian=v2*multiplier;

//haveNextNextGaussian=1;

v0=v1*multiplier;//均值为0,方差为1的标准正态分布

}while(s>=1||s==0);

returnv0*b+a;//产生均值为a,方差为b的随机信号

}

floatAverageRandom(floatmin,floatmax)

{

floatc1;

c1=(((float)rand()/RAND_MAX))*(max-min)+min;

returnc1;

}

floatsl(intn,inttype,floata,floatb)

{

floata1,b1;

a1=a;b1=b;

if(type==0)

{

c=AverageRandom(a1,b1);//产生均匀分布U(a,b)

returnc;

}

elseif(type==1)

{

c=nextGaussian(a1,b1);//产生高斯分布N(a,b)

returnc;

}

}

voidmain()

{intdet;

int*count;

floatbefore,next;

float*xplot;

float*s;

FILE*outfile;

srand(time(0));

cout<<"请输入产生的信号类型--0:

平均分布,1:

高斯分布:

";

cin>>type;

if(type==1)

{

cout<<"请输入产生点的均值和方差:

";

cin>>a>>b;

}

else

{cout<<"请输入产生点范围:

";

cin>>a>>b;

}

cout<<"请输入产生点的个数:

";

cin>>n;

s=newfloat[n];

outfile=fopen("output.txt","w");

for(inti=0;i

{c=sl(n,type,a,b);

fprintf(outfile,"%f",c);

s[i]=c;

}

cout<<"请输入测试的精确度1--1000:

";

cin>>det;

count=newint[det];

xplot=newfloat[det];

FILE*outfile1;

FILE*outfile2;

outfile1=fopen("count.txt","w");

outfile2=fopen("xplot.txt","w");

if(type==0)//如果是均匀分布的话

{before=a;

next=a+(b-a)/det;

for(intk=0;k

{count[k]=0;

for(intj=0;j

{if(s[j]>before&&s[j]

count[k]=count[k]+1;

}

xplot[k]=(before+next)/2;

before=before+(b-a)/det;

next=next+(b-a)/det;

}

}

else//如果是高斯分布的话

{a=a-3*b;

b=a+6*b;

before=a;

next=a+(b-a)/det;

for(intk=0;k

{count[k]=0;

for(intj=0;j

{

if(s[j]>before&&s[j]

count[k]=count[k]+1;

}

xplot[k]=(before+next)/2;

before=before+(b-a)/det;

next=next+(b-a)/det;

}

}

}

运行程序:

均匀分布数据直方图

3泊松分布

#include

#include

#include

#include

#include

doubleU_Random();//均匀随机数0到1

intpossion(intLambda);//泊松分布随机数

main()

{

doubleu;

floata;

intLambda;//可以改为需要的目标平均值

inti;

intn;

float*s;

FILE*outfile;

printf("Lambda=\n");

scanf("%d",&Lambda);

srand((unsigned)time(NULL));//种子

u=U_Random();

printf("n=\n");

scanf("%d",&n);

s=newfloat[n];

outfile=fopen("output.txt","w");

for(i=0;i

{

a=possion(Lambda);

fprintf(outfile,"%f",a);

s[i]=a;

}

delete[]s;

}

intpossion(intLambda)/*generatepoissonrd,withmean=Lamda*/

{

intk=0;

doublep=1.0;

doublel,u;

l=exp(-Lambda);/*exp(-Lambda)isdicimalzero*/

//printf("l=%.15lf\n",l);

while(p>=l)

{

u=U_Random();

p*=u;

k++;

}

returnk-1;

}

doubleU_Random()/*0to1rd*/

{

doublef;

f=(double)(rand()%1001);

returnf/1000.0;

}

运行程序:

泊松分布拟合图

4指数分布

#include

//#include"iomanip.h"

#include"iomanip"

#include

#include

usingnamespacestd;

constintA=2045;

constintC=1;

constintM=1048576;//2的20次方

doublejunyun(doublea,doubleb,longint*seed)//采取的方法是混合同余法其中D,C,M都是自定义的常数

{

doublet;

*seed=A*(*seed)+C;

*seed=(*seed)%M;

t=(*seed)/(double)M;

t=a+(b-a)*t;

returnt;

}

doubleexponent(doublebeta,longint*s)

{

doubleu,x;

u=junyun(0.0,1.0,s);

x=-beta*log(u);

returnx;

}

intmain()

{

inti,j,num;

doublex,beta;

longints;

cout<<"输入均值μ:

"<

cin>>beta;

cout<<"输入随机种子:

"<

cin>>s;

cout<<"输入生成随机数个数:

"<

cin>>num;

ofstreamcout("zhishu.txt");

for(i=0;i

{

x=exponent(beta,&s);

cout<

}

return0;

}

运行程序:

指数分布直方图

指数分布曲线图

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1