/* package of routines to generate and apply random numbers from More C Tools for Scientists and Engineers by L. Baker */ /* You may change stmt below, replacing random() with u16() or u32() */ #define urand() random() long int seed; int naflag,nflag; long int s1,s2; int s16,s26,s36; double u32(),u16(),random(); double ex(),ca(),na(); double erlang(k,mean) int k; double mean; { double exp(),expon(),emult,sum; int i; emult= mean/k; sum=0.; for (i=0;i10) { printf(" trouble in normal %f %f %f\n",r1,r2,s); break; } */ };/*end while*/ return(0.);/* Keep DeSmet happy*/ } double snorm1,snorm2; double norm(mean,sd) double mean,sd; { /* nflag must be initialized to 1 before first call*/ nflag^=1; if(nflag)return snorm2; return normal(mean,sd,&snorm1,&snorm2); } /* TEST CODE BELOW */ main(argc,argv) int argc; char **argv; { int i,j,k; double urand(),normal(),mean,sd,z,y,x,xs,ys,rk,meant,m2,var,mu3,mu4,skew,kurt; double sum1,sum2,sum3,sum4; double u,random(); long int outseed; seed=1; naflag=1; nflag=1; s1=12345;s2=67890; s16=12;s26=23;s36=34; for(i=0;i<=10000;i++) {outseed=seed; u=random(); } printf(" u=%f seed = %ld \n",u,outseed); printf(" results of u16:\n"); for(i=0;i<=1000;i++) {u=u16(); if(i%100 ==0)printf(" u=%f \n",u); } printf(" results of u32:\n"); for(i=0;i<=1000;i++) {u=u32(); if(i%100 ==0)printf(" u=%f \n",u); } /* now test distributions */ mean=0.;sd=1.; while(1) {printf(" enter count");scanf("%d",&k); if(k<=0)break; printf(" kount=%d\n",k); sum1=sum2=sum3=sum4=0.; for (i=0;i706)z-=32362; z+=s36; if(z<1)z+=32362; return z*3.0899e-5; } double random() { long int a=16807,m=2147483647,q=127773,r=2836; long int lo,hi,test; hi= seed / q; lo= seed % q; test= a*lo-r*hi; seed=(test>0)?test: test+m; return (double) seed/m; } double ex() { static double ln2=.6931471805599453,a=5.7133631526454228, b=3.4142135623730950,c=-1.6734053240284925,p=.9802581434685472, q=5.6005707569738080,r=3.3468106480569850,h=.0026106723602095, d=.08576764376269050; double g,aux,u,up,y,random(),exp(),aux2,aux1,H=2.28421e-4; /*H=h*d/p;*/ u=random(); g=c; dbl: u=u+u; if(u<1.) { g+=ln2; goto dbl; } u--; if(u0.0)return t*(c/s+d); while(1) { u=random(); t=u-.5; s=.25-t*t; up=random(); x=t*(a/s+b); if( s*s*((1+x*x)*(h*up+p)-q)+s<=.5)return x; } return(0.); } static double y; double na() { int b; double ex(),random(),t,up,u,e,s,ca,x,r; static double a=.6380631366077803,g=.5959486060529070, q=.93399629257603656,w=.2488703380083841,c=.6366197723675813, d=.5972997593539963,h=.0214949094570452,p=4.9125013953033204; /* initialize naflag=1*/ naflag ^= 1; if(naflag) return y; u=random(); b=(u<.5)? 0:1; e=ex(); r=e+e; /* ca= cauchy dist*/ u= (b)? u+u-1. : u+u; t=u-.5; s=w-t*t; if(s>0.0) ca=t*(c/s+d); else while(1) { u=random(); t=u-.5; s=.25-t*t; up=random(); ca=t*(a/s+g); if( s*s*((1+ca*ca)*(h*up+p)-q)+s<=.5)break; } x=sqrt(r/(1.+ca*ca)); y=ca*x; if(!b) return x; else return -x; return 0.; }