一般有兩種算法:
創(chuàng)新互聯(lián)公司專注于坊子網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供坊子營銷型網(wǎng)站建設,坊子網(wǎng)站制作、坊子網(wǎng)頁設計、坊子網(wǎng)站官網(wǎng)定制、成都小程序開發(fā)服務,打造坊子網(wǎng)絡公司原創(chuàng)品牌,更為您提供坊子網(wǎng)站排名全網(wǎng)營銷落地服務。
算法一產生12個(0,1)平均分布的隨機函數(shù),用大數(shù)定理可以模擬出正態(tài)分布。
算法二用到了數(shù)學中的雅可比變換,直接生成正態(tài)分布,但此算法在計算很大規(guī)模的數(shù)時
會出現(xiàn)溢出錯誤。
測試程序:
#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;i10;i++)
printf("%lf\t",_sta(mu,sigma));
printf("Algorithm 2:\n");
for(i=0;i10;i++)
printf("%lf\t",_sta2(mu,sigma));
return 0;
}
//由均勻分布的隨機數(shù)得到正態(tài)分布的隨機數(shù)
#include math.h
float gasdev(idum)
int *idum;
{
static int iset=0;
static float gset;
float fac,r,v1,v2;
float ran1();//產生均勻分布的隨機數(shù),可利用系統(tǒng)函數(shù)改寫
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;
}
}
原理可找本數(shù)值算法方面的書看看。
double gaussian(double u) //用Box_Muller算法產生高斯分布的隨機數(shù)
{
double r,t,z,x;
double s1,s2;
s1=(1.0+rand())/(RAND_MAX+1.0);
s2=(1.0+rand())/(RAND_MAX+1.0);
r=sqrt(-2*log(s2)/log(e));
t=2*pi*s1;
z=r*cos(t);
x=u+z*N;
return x;
}
以前寫的一個函數(shù),u是均值,N是方差
你看看計算公式是不是這樣的?
還有精度要多少啊?
查表可知,
F(2.1)?=0.9821
F(-0.3)=1-0.6179
F(2.1)?-?F(-0.3)?=?0.6
源程序
#includestdio.h
#includemath.h
double?f(double?x)
{
return?exp(-x*x/2);
}
double?F(double?a,double?b,double?ep=1e-6)
{
double?h,s1=0,s2=(b-a)*(f(a)+f(b))/2;
int?n,k;
for(int?n=1;fabs(s1-s2)ep;n*=2)
{
h=(b-a)/n;
s1?=?s2;
s2?=?0;
for(int?k=0;kn;++k)
{
s2?+=?h*f(a+(k+0.5)*h);
}
s2?=?(s1+s2)/2;
}
return?s2*sqrt(1/(8*atan(1.0)));
}
int?main()
{
double?c,d;
scanf("%lf",c);
scanf("%lf",d);
printf("%lf",F(c,d));
return?0;
}
C語言中計算一個數(shù)的N次方可以用庫函數(shù)pow來實現(xiàn)。
函數(shù)原型:double pow(double x, double y);
功 能:計算x^y的值
返 回 值:計算結果
舉例如下:
double a = pow(3.14, 2); // 計算3.14的平方
注:使用pow函數(shù)時,需要將頭文件#includemath.h包含進源文件中。