求大神给出用C语言编程生成正态分布随机数的程序,要不是标准正态分布的

求大神给出用C语言编程生成正态分布随机数的程序,要不是标准正态分布的,第1张

一般有两种算法

算法一产生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=1i<=12i++)

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=0i<10i++)

printf("%lf\t",_sta(mu,sigma))

printf("Algorithm 2:\n")

for(i=0i<10i++)

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

}

}

原理可找本数值算法方面的书看看。

调试程序时世团,随机数种子可以设常数,例如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=0i<=N-2i=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=0i<Ni++){

if (rd[i]>mx)mx=rd[i]

if (rd[i]<mi)mi=rd[i]

}

//printf("mi=%lf mx=%lf\n",mi,mx)

for (i=0i<Ni++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01

for (i=0i<N-2i=i+2) printf("%lf %lf\n",rd[i],rd[i+1])

return 0

}

/派老/运用泰勒公式展开的方法 #include<stdio.h>#include<math.h>#define PI 3.141592653589793 void main() { long double w,x,y=0,z=1,sum,b=1int n=1,a=1,m=1 printf("Please enter x:")scanf("%lf",&x)while(fabs(z)>1e-15) { w=pow(x,n)z=a*w/(b*n)y+=z a*=-1 b*=2*m //printf("%30.25f\n%d!!=%30.25f\n",z,2*m,b)m++n+=2 } sum=0.5+y/sqrt(2*PI)printf("\nThe result you want is:\nPhi(%f)=%18.15f\n",x,sum)} 具体数学算法: Phi(x)=0.5+\frac{1}\sqrt{2\pi}\,\left[x+\sum_{n=1^\infty}(-1)^n*x^{2n+1}*\frac{1*3*5*…*(2n-1)}{(2n+1)!}]\right=0.5+\frac{1}\sqrt{2\pi}(x-x^3/3!+3x^5/5!-15x^7/7!+105x^9/蚂羡则9!-945x^11/11!+10395x^13/13!-135135x^15/15!+2027025x^17/17!-34459425x^19/19!+654729075x^21/21!-13749310575x^23/23!+316234143225x^25/25!-7905853580625x^27/27!+213458046676875x^29/29!-6190283353629375x^31/31!+191898783962510625x^33/33!-6332659870762850625x^35 /35!+22164395476699771875x^37/37!-8200794532637891559375x^39/闷棚39!+319830986772877770815625x^41/41!-13113070457687988603440625x^43/43!+563862029680583509947946875x^45/45!-25373791335626257947657609375x^47/47!+1192568192774434123539907640625x^49/49!-58435841445947272053455474390625x^51/51!+2980227913743310874726229193921875x^53/53!……)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12429965.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存