⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randlib.c~

📁 雷达工具箱
💻 C~
📖 第 1 页 / 共 5 页
字号:
       XR:  RIGHT END OF THE TRIANGLE       AL:  TEMPORARY VARIABLE       XLL:  RATE FOR THE LEFT EXPONENTIAL TAIL       XLR:  RATE FOR THE RIGHT EXPONENTIAL TAIL       P2:  AREA OF THE PARALLELOGRAMS       P3:  AREA OF THE LEFT EXPONENTIAL TAIL       P4:  AREA OF THE RIGHT EXPONENTIAL TAIL       U:  A U(0,P4) RANDOM VARIATE USED FIRST TO SELECT ONE OF THE           FOUR REGIONS AND THEN CONDITIONALLY TO GENERATE A VALUE           FROM THE REGION       V:  A U(0,1) RANDOM NUMBER USED TO GENERATE THE RANDOM VALUE           (REGION 1) OR TRANSFORMED INTO THE VARIATE TO ACCEPT OR           REJECT THE CANDIDATE VALUE       IX:  INTEGER CANDIDATE VALUE       X:  PRELIMINARY CONTINUOUS CANDIDATE VALUE IN REGION 2 LOGIC           AND A FLOATING POINT IX IN THE ACCEPT/REJECT LOGIC       K:  ABSOLUTE VALUE OF (IX-M)       F:  THE HEIGHT OF THE SCALED DENSITY FUNCTION USED IN THE           ACCEPT/REJECT DECISION WHEN BOTH M AND IX ARE SMALL           ALSO USED IN THE INVERSE TRANSFORMATION       R: THE RATIO P/Q       G: CONSTANT USED IN CALCULATION OF PROBABILITY       MP:  MODE PLUS ONE, THE LOWER INDEX FOR EXPLICIT CALCULATION            OF F WHEN IX IS GREATER THAN M       IX1:  CANDIDATE VALUE PLUS ONE, THE LOWER INDEX FOR EXPLICIT             CALCULATION OF F WHEN IX IS LESS THAN M       I:  INDEX FOR EXPLICIT CALCULATION OF F FOR BTPE       AMAXP: MAXIMUM ERROR OF THE LOGARITHM OF NORMAL BOUND       YNORM: LOGARITHM OF NORMAL BOUND       ALV:  NATURAL LOGARITHM OF THE ACCEPT/REJECT VARIATE V       X1,F1,Z,W,Z2,X2,F2, AND W2 ARE TEMPORARY VARIABLES TO BE       USED IN THE FINAL ACCEPT/REJECT TEST       QN: PROBABILITY OF NO SUCCESS IN N TRIALS     REMARK       IX AND JX COULD LOGICALLY BE THE SAME VARIABLE, WHICH WOULD       SAVE A MEMORY POSITION AND A LINE OF CODE.  HOWEVER, SOME       COMPILERS (E.G.,CDC MNF) OPTIMIZE BETTER WHEN THE ARGUMENTS       ARE NOT INVOLVED.     ISEED NEEDS TO BE DOUBLE PRECISION IF THE IMSL ROUTINE     GGUBFS IS USED TO GENERATE UNIFORM RANDOM NUMBER, OTHERWISE     TYPE OF ISEED SHOULD BE DICTATED BY THE UNIFORM GENERATOR***************************************************************************DETERMINE APPROPRIATE ALGORITHM AND WHETHER SETUP IS NECESSARY*/{/* JJV changed initial values to ridiculous values */static float psave = -1.0E37;static long nsave = -214748365;static long ignbin,i,ix,ix1,k,m,mp,T1;static float al,alv,amaxp,c,f,f1,f2,ffm,fm,g,p,p1,p2,p3,p4,q,qn,r,u,v,w,w2,x,x1,    x2,xl,xll,xlr,xm,xnp,xnpq,xr,ynorm,z,z2;    if(pp != psave) goto S10;    if(n != nsave) goto S20;    if(xnp < 30.0) goto S150;    goto S30;S10:/******SETUP, PERFORM ONLY WHEN PARAMETERS CHANGEJJV added checks to ensure 0.0 <= PP <= 1.0*/    if(pp < 0.0F) ftnstop("PP < 0.0 in IGNBIN");    if(pp > 1.0F) ftnstop("PP > 1.0 in IGNBIN");    psave = pp;    p = min(psave,1.0-psave);    q = 1.0-p;S20:/*JJV added check to ensure N >= 0*/    if(n < 0L) ftnstop("N < 0 in IGNBIN");    xnp = n*p;    nsave = n;    if(xnp < 30.0) goto S140;    ffm = xnp+p;    m = ffm;    fm = m;    xnpq = xnp*q;    p1 = (long) (2.195*sqrt(xnpq)-4.6*q)+0.5;    xm = fm+0.5;    xl = xm-p1;    xr = xm+p1;    c = 0.134+20.5/(15.3+fm);    al = (ffm-xl)/(ffm-xl*p);    xll = al*(1.0+0.5*al);    al = (xr-ffm)/(xr*q);    xlr = al*(1.0+0.5*al);    p2 = p1*(1.0+c+c);    p3 = p2+c/xll;    p4 = p3+c/xlr;S30:/******GENERATE VARIATE*/    u = ranf()*p4;    v = ranf();/*     TRIANGULAR REGION*/    if(u > p1) goto S40;    ix = xm-p1*v+u;    goto S170;S40:/*     PARALLELOGRAM REGION*/    if(u > p2) goto S50;    x = xl+(u-p1)/c;    v = v*c+1.0-ABS(xm-x)/p1;    if(v > 1.0 || v <= 0.0) goto S30;    ix = x;    goto S70;S50:/*     LEFT TAIL*/    if(u > p3) goto S60;    ix = xl+log(v)/xll;    if(ix < 0) goto S30;    v *= ((u-p2)*xll);    goto S70;S60:/*     RIGHT TAIL*/    ix = xr-log(v)/xlr;    if(ix > n) goto S30;    v *= ((u-p3)*xlr);S70:/******DETERMINE APPROPRIATE WAY TO PERFORM ACCEPT/REJECT TEST*/    k = ABS(ix-m);    if(k > 20 && k < xnpq/2-1) goto S130;/*     EXPLICIT EVALUATION*/    f = 1.0;    r = p/q;    g = (n+1)*r;    T1 = m-ix;    if(T1 < 0) goto S80;    else if(T1 == 0) goto S120;    else  goto S100;S80:    mp = m+1;    for(i=mp; i<=ix; i++) f *= (g/i-r);    goto S120;S100:    ix1 = ix+1;    for(i=ix1; i<=m; i++) f /= (g/i-r);S120:    if(v <= f) goto S170;    goto S30;S130:/*     SQUEEZING USING UPPER AND LOWER BOUNDS ON ALOG(F(X))*/    amaxp = k/xnpq*((k*(k/3.0+0.625)+0.1666666666666)/xnpq+0.5);    ynorm = -(k*k/(2.0*xnpq));    alv = log(v);    if(alv < ynorm-amaxp) goto S170;    if(alv > ynorm+amaxp) goto S30;/*     STIRLING'S FORMULA TO MACHINE ACCURACY FOR     THE FINAL ACCEPTANCE/REJECTION TEST*/    x1 = ix+1.0;    f1 = fm+1.0;    z = n+1.0-fm;    w = n-ix+1.0;    z2 = z*z;    x2 = x1*x1;    f2 = f1*f1;    w2 = w*w;    if(alv <= xm*log(f1/x1)+(n-m+0.5)*log(z/w)+(ix-m)*log(w*p/(x1*q))+(13860.0-      (462.0-(132.0-(99.0-140.0/f2)/f2)/f2)/f2)/f1/166320.0+(13860.0-(462.0-      (132.0-(99.0-140.0/z2)/z2)/z2)/z2)/z/166320.0+(13860.0-(462.0-(132.0-      (99.0-140.0/x2)/x2)/x2)/x2)/x1/166320.0+(13860.0-(462.0-(132.0-(99.0      -140.0/w2)/w2)/w2)/w2)/w/166320.0) goto S170;    goto S30;S140:/*     INVERSE CDF LOGIC FOR MEAN LESS THAN 30*/    qn = pow(q,(double)n);    r = p/q;    g = r*(n+1);S150:    ix = 0;    f = qn;    u = ranf();S160:    if(u < f) goto S170;    if(ix > 110) goto S150;    u -= f;    ix += 1;    f *= (g/ix-r);    goto S160;S170:    if(psave > 0.5) ix = n-ix;    ignbin = ix;    return ignbin;}long ignnbn(long n,float p)/***********************************************************************      long ignnbn(long n,float p)                GENerate Negative BiNomial random deviate                              Function     Generates a single random deviate from a negative binomial     distribution.                              Arguments     N  --> The number of trials in the negative binomial distribution            from which a random deviate is to be generated.	    JJV (N > 0)     P  --> The probability of an event.     JJV    (0.0 < P < 1.0)                              Method     Algorithm from page 480 of      Devroye, Luc      Non-Uniform Random Variate Generation.  Springer-Verlag,     New York, 1986.***********************************************************************/{static long ignnbn;static float y,a,r;/*     ..     .. Executable Statements ..*//*     Check Arguments*/    if(n <= 0L) ftnstop("N <= 0 in IGNNBN");    if(p <= 0.0F) ftnstop("P <= 0.0 in IGNNBN");    if(p >= 1.0F) ftnstop("P >= 1.0 in IGNNBN");/*     Generate Y, a random gamma (n,(1-p)/p) variable     JJV Note: the above parametrization is consistent with Devroye,     JJV       but gamma (p/(1-p),n) is the equivalent in our code*/    r = (float)n;    a = p/(1.0F-p);/* * JJV changed this to call SGAMMA directly *  y = gengam(a,r); <- OLD */    y = sgamma(r)/a;/*     Generate a random Poisson(y) variable*/    ignnbn = ignpoi(y);    return ignnbn;}long ignpoi(float mu)/***********************************************************************     long ignpoi(float mu)                    GENerate POIsson random deviate                              Function     Generates a single random deviate from a Poisson     distribution with mean MU.                              Arguments     mu --> The mean of the Poisson distribution from which            a random deviate is to be generated.	    (mu >= 0.0)     ignpoi <-- The random deviate.                              Method     Renames KPOIS from TOMS as slightly modified by BWB to use RANF     instead of SUNIF.     For details see:               Ahrens, J.H. and Dieter, U.               Computer Generation of Poisson Deviates               From Modified Normal Distributions.               ACM Trans. Math. Software, 8, 2               (June 1982),163-179********************************************************************************************************************************************                                                                                                                                                 P O I S S O N  DISTRIBUTION                                                                                                                                                                                  ********************************************************************************************************************************************                                                                           FOR DETAILS SEE:                                                                                                                                      AHRENS, J.H. AND DIETER, U.                                           COMPUTER GENERATION OF POISSON DEVIATES                               FROM MODIFIED NORMAL DISTRIBUTIONS.                                   ACM TRANS. MATH. SOFTWARE, 8,2 (JUNE 1982), 163 - 179.                                                                            (SLIGHTLY MODIFIED VERSION OF THE PROGRAM IN THE ABOVE ARTICLE)                                                                        **********************************************************************      INTEGER FUNCTION IGNPOI(IR,MU)     INPUT:  IR=CURRENT STATE OF BASIC RANDOM NUMBER GENERATOR             MU=MEAN MU OF THE POISSON DISTRIBUTION     OUTPUT: IGNPOI=SAMPLE FROM THE POISSON-(MU)-DISTRIBUTION     MUPREV=PREVIOUS MU, MUOLD=MU AT LAST EXECUTION OF STEP P OR B.     TABLES: COEFFICIENTS A0-A7 FOR STEP F. FACTORIALS FACT     COEFFICIENTS A(K) - FOR PX = FK*V*V*SUM(A(K)*V**K)-DEL     SEPARATION OF CASES A AND B*/{extern float fsign( float num, float sign );static float a0 = -0.5;static float a1 = 0.3333333;static float a2 = -0.2500068;static float a3 = 0.2000118;static float a4 = -0.1661269;static float a5 = 0.1421878;static float a6 = -0.1384794;static float a7 = 0.125006;/* JJV changed the initial values of MUPREV and MUOLD */static float muold = -1.0E37;static float muprev = -1.0E37;static float fact[10] = {    1.0,1.0,2.0,6.0,24.0,120.0,720.0,5040.0,40320.0,362880.0};/* JJV added ll to the list, for Case A */static long ignpoi,j,k,kflag,l,ll,m;static float b1,b2,c,c0,c1,c2,c3,d,del,difmuk,e,fk,fx,fy,g,omega,p,p0,px,py,q,s,    t,u,v,x,xx,pp[35];    if(mu == muprev) goto S10;    if(mu < 10.0) goto S120;/*     C A S E  A. (RECALCULATION OF S,D,LL IF MU HAS CHANGED)     JJV changed l in Case A to ll*/    muprev = mu;    s = sqrt(mu);    d = 6.0*mu*mu;/*             THE POISSON PROBABILITIES PK EXCEED THE DISCRETE NORMAL             PROBABILITIES FK WHENEVER K >= M(MU). LL=IFIX(MU-1.1484)             IS AN UPPER BOUND TO M(MU) FOR ALL MU >= 10 .*/    ll = (long) (mu-1.1484);S10:/*     STEP N. NORMAL SAMPLE - SNORM(IR) FOR STANDARD NORMAL DEVIATE*/    g = mu+s*snorm();    if(g < 0.0) goto S20;    ignpoi = (long) (g);/*     STEP I. IMMEDIATE ACCEPTANCE IF IGNPOI IS LARGE ENOUGH*/    if(ignpoi >= ll) return ignpoi;/*     STEP S. SQUEEZE ACCEPTANCE - SUNIF(IR) FOR (0,1)-SAMPLE U*/    fk = (float)ignpoi;    difmuk = mu-fk;    u = ranf();    if(d*u >= difmuk*difmuk*difmuk) return ignpoi;S20:/*     STEP P. PREPARATIONS FOR STEPS Q AND H.             (RECALCULATIONS OF PARAMETERS IF NECESSARY)             .3989423=(2*PI)**(-.5)  .416667E-1=1./24.  .1428571=1./7.             THE QUANTITIES B1, B2, C3, C2, C1, C0 ARE FOR THE HERMITE             APPROXIMATIONS TO THE DISCRETE NORMAL PROBABILITIES FK.             C=.1069/MU GUARANTEES MAJORIZATION BY THE 'HAT'-FUNCTION.*/    if(mu == muold) goto S30;    muold = mu;    omega = 0.3989423/s;    b1 = 4.166667E-2/mu;    b2 = 0.3*b1*b1;    c3 = 0.1428571*b1*b2;    c2 = b2-15.0*c3;    c1 = b1-6.0*b2+45.0*c3;    c0 = 1.0-b1+3.0*b2-15.0*c3;    c = 0.1069/mu;S30:    if(g < 0.0) goto S50;/*             'SUBROUTINE' F IS CALLED (KFLAG=0 FOR CORRECT RETURN)*/    kflag = 0;    goto S70;S40:/*     STEP Q. QUOTIENT ACCEPTANCE (RARE CASE)*/    if(fy-u*fy <= py*exp(px-fx)) return ignpoi;S50:/*     STEP E. EXPONENTIAL SAMPLE - SEXPO(IR) FOR STANDARD EXPONENTIAL             DEVIATE E AND SAMPLE T FROM THE LAPLACE 'HAT'             (IF T <= -.6744 THEN PK < FK FOR ALL MU >= 10.)*/    e = sexpo();    u = ranf();    u += (u-1.0);    t = 1.8+fsign(e,u);    if(t <= -0.6744) goto S50;    ignpoi = (long) (mu+s*t);    fk = (float)ignpoi;    difmuk = mu-fk;/*             'SUBROUTINE' F IS CALLED (KFLAG=1 FOR CORRECT RETURN)*/    kflag = 1;    goto S70;S60:/*     STEP H. HAT ACCEPTANCE (E IS REPEATED ON REJECTION)*/    if(c*fabs(u) > py*exp(px+e)-fy*exp(fx+e)) goto S50;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -