|
|
1.1 ! root 1: DOUBLE PRECISION FUNCTION URAND(IY) ! 2: INTEGER IY ! 3: C ! 4: C URAND IS A UNIFORM RANDOM NUMBER GENERATOR BASED ON THEORY AND ! 5: C SUGGESTIONS GIVEN IN D.E. KNUTH (1969), VOL 2. THE INTEGER IY ! 6: C SHOULD BE INITIALIZED TO AN ARBITRARY INTEGER PRIOR TO THE FIRST CALL ! 7: C TO URAND. THE CALLING PROGRAM SHOULD NOT ALTER THE VALUE OF IY ! 8: C BETWEEN SUBSEQUENT CALLS TO URAND. VALUES OF URAND WILL BE RETURNED ! 9: C IN THE INTERVAL (0,1). ! 10: C SEE FORSYTHE, MALCOLM AND MOLER (1977). ! 11: C ! 12: INTEGER IA,IC,ITWO,M2,M,MIC ! 13: DOUBLE PRECISION HALFM,S ! 14: DOUBLE PRECISION DATAN,DSQRT ! 15: DATA M2/0/,ITWO/2/ ! 16: IF (M2 .NE. 0) GO TO 20 ! 17: C ! 18: C IF FIRST ENTRY, COMPUTE MACHINE INTEGER WORD LENGTH ! 19: C ! 20: M = 1 ! 21: 10 M2 = M ! 22: M = ITWO*M2 ! 23: IF (M .GT. M2) GO TO 10 ! 24: HALFM = M2 ! 25: C ! 26: C COMPUTE MULTIPLIER AND INCREMENT FOR LINEAR CONGRUENTIAL METHOD ! 27: C ! 28: IA = 8*IDINT(HALFM*DATAN(1.D0)/8.D0) + 5 ! 29: IC = 2*IDINT(HALFM*(0.5D0-DSQRT(3.D0)/6.D0)) + 1 ! 30: MIC = (M2 - IC) + M2 ! 31: C ! 32: C S IS THE SCALE FACTOR FOR CONVERTING TO FLOATING POINT ! 33: C ! 34: S = 0.5D0/HALFM ! 35: C ! 36: C COMPUTE NEXT RANDOM NUMBER ! 37: C ! 38: 20 IY = IY*IA ! 39: C ! 40: C THE FOLLOWING STATEMENT IS FOR COMPUTERS WHICH DO NOT ALLOW ! 41: C INTEGER OVERFLOW ON ADDITION ! 42: C ! 43: IF (IY .GT. MIC) IY = (IY - M2) - M2 ! 44: C ! 45: IY = IY + IC ! 46: C ! 47: C THE FOLLOWING STATEMENT IS FOR COMPUTERS WHERE THE ! 48: C WORD LENGTH FOR ADDITION IS GREATER THAN FOR MULTIPLICATION ! 49: C ! 50: IF (IY/2 .GT. M2) IY = (IY - M2) - M2 ! 51: C ! 52: C THE FOLLOWING STATEMENT IS FOR COMPUTERS WHERE INTEGER ! 53: C OVERFLOW AFFECTS THE SIGN BIT ! 54: C ! 55: IF (IY .LT. 0) IY = (IY + M2) + M2 ! 56: URAND = DBLE(IY)*S ! 57: RETURN ! 58: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.