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

