C----------------------------------------------------------------------- C This is a simple set of random number routines C C RANGEN returns a random number between 0 and 1 C RANSET allows the setting of the seeds C RANGET returns the current seeds C RANINT returns a random integer between the limits C RANUNI returns a random number between the limits C----------------------------------------------------------------------- FUNCTION RANGEN(I) C----------------------------------------------------------------------- C MAIN RANDOM NUMBER GENERATOR C USES METHOD OF l'Ecuyer, (VIA F.JAMES, COMP PHYS COMM 60(1990)329) C Taken from HERWIG C GENSET allows the setting of the seeds C GENGET gets the current seeds C----------------------------------------------------------------------- IMPLICIT NONE DOUBLE PRECISION RANGEN,RANSET,RANGET INTEGER I,ISEED(2),K,IZ,JSEED(2) SAVE ISEED DATA ISEED/12345,67890/ K=ISEED(1)/53668 ISEED(1)=40014*(ISEED(1)-K*53668)-K*12211 IF (ISEED(1).LT.0) ISEED(1)=ISEED(1)+2147483563 K=ISEED(2)/52774 ISEED(2)=40692*(ISEED(2)-K*52774)-K*3791 IF (ISEED(2).LT.0) ISEED(2)=ISEED(2)+2147483399 IZ=ISEED(1)-ISEED(2) IF (IZ.LT.1) IZ=IZ+2147483562 RANGEN=DBLE(IZ)*4.656613001013252D-10 C---> (4.656613001013252D-10 = 1.D0/2147483589) RETURN C----------------------------------------------------------------------- ENTRY RANSET(JSEED) C----------------------------------------------------------------------- IF (JSEED(1).EQ.0.OR.JSEED(2).EQ.0) print *,'random number error' ISEED(1)=JSEED(1) ISEED(2)=JSEED(2) RANSET=0.0D0 999 RETURN C----------------------------------------------------------------------- ENTRY RANGET(JSEED) C----------------------------------------------------------------------- JSEED(1)=ISEED(1) JSEED(2)=ISEED(2) RANGET=0.0D0 RETURN END CDECK ID>, RANINT. *CMZ :- -26/04/91 11.11.56 by Bryan Webber *-- Author : Bryan Webber C----------------------------------------------------------------------- FUNCTION RANINT(IMIN,IMAX) C----------------------------------------------------------------------- C RANDOM INTEGER IN [IMIN,IMAX]. N.B. ASSUMES IMAX.GE.IMIN C----------------------------------------------------------------------- DOUBLE PRECISION RANGEN,RN,ONE INTEGER RANINT,IMIN,IMAX EXTERNAL RANGEN PARAMETER (ONE=1.0D0) 1 RN=RANGEN(0) IF (RN.EQ.ONE) GOTO 1 RN=RN*(IMAX-IMIN+1) RANINT=IMIN+INT(RN) END CDECK ID>, RANUNI. *CMZ :- -26/04/91 14.55.45 by Federico Carminati *-- Author : Bryan Webber C----------------------------------------------------------------------- FUNCTION RANUNI(I,A,B) C----------------------------------------------------------------------- C Uniform random random number in range [A,B] C----------------------------------------------------------------------- DOUBLE PRECISION RANUNI,RANGEN,A,B,RN INTEGER I EXTERNAL RANGEN RN=RANGEN(I) RANUNI=A+RN*(B-A) END