#include #include int ix=1,iy=1; void main(){ float a,b; int i,j,n; double urnd(void); double x0[100001],q[100001],w[100001]; double x,u,x1=0.0,x2=0.0; for(i=1;i<=10000;i++) urnd(); scanf("%f%f%d",&a,&b,&n); w[0]=0.0; for(i=1;i<=n;i++){ x0[i]=urnd(); w[i]=w[i-1]+exp( (a-1.)*log(x0[i])+(b-1.)*log(1.-x0[i]) ); } for(i=1;i<=n;i++) w[i]/=w[n]; for(i=1;i<=n;i++){ u=urnd(); for(j=1;j<=n;j++){ if( (w[j-1] <= u) && (u < w[j]) ){ x=x0[j]; goto LABEL; } } LABEL: x1+=x/((double)n); x2+=x*x/((double)n); } printf("# of Random Draws = %5d\n",n); printf("Parameters = (%7.1f,%7.1f)\n",a,b); printf("Mean = %10.5lf, which should be close to %10.5f\n" ,x1,a/(a+b)); printf("Variance = %10.5lf, which should be close to %10.5f\n" ,x2-x1*x1,a*b/((a+b)*(a+b)*(a+b+1.))); } /* ------------------------------------------------ */ double urnd(void) { int kx,ky; double rn; /* Input: ix, iy: Seeds Output: rn: Uniform Random Draw U(0,1) */ kx=ix/53668; ix=40014*(ix-kx*53668)-kx*12211; ky=iy/52774; iy=40692*(iy-ky*52774)-ky*3791; rn=(float)(ix-iy)/2147483563.; rn-=(int)rn; if( rn<0.) rn++; return rn; }