      PROGRAM ZUFALL
**********************************************************************
*     Berechnung einer Zufallskette aus Einsen und Nullen
*********************************************************************
 
      REAL R(97)
      EXTERNAL RAN

C     IBIT(X) = 0 für X < 0.5, IBIT(X) = 1 für X > 0.5
      IBIT(X) = INT(2.*X)

      PRINT *, 
     &     'Eingabe Länge der Zufallsfolge , Anfangszustand ISEED'
      PRINT *, 
     &     ' (2 natuerliche Zahlen):'
      READ *,M,ISEED


      PRINT *, 
     &     M,' zufaellige Werte von 0 und 1:'

C     RAN Zufallszahl zwischen 0 und 1
      DO 100, I=1,M
          PRINT *, IBIT(RAN(ISEED,IX1,IX2,IX3,R))

 100  CONTINUE
      
      END       


*
*
      REAL FUNCTION RAN(IDUM,IX1,IX2,IX3,R)
**********************************************************************
*     Returns a random deviate between 0.0 and 1.0. Set IDUM to
*     any negative value to initialize or reinitialize the sequence.
*     Numerical Recipes p.196
**********************************************************************
      REAL R(97)
      INTEGER  IX1,IX2,IX3,IC1,IC2,IC3,IA1,IA2,IA3,IFF
      PARAMETER (M1=259200,IA1=7141,IC1=54733,RM1=1./M1)
      PARAMETER (M2=134456,IA2=8121,IC2=28411,RM2=1./M2)
      PARAMETER (M3=243000,IA3=4561,IC3=51349)

      DATA IFF /0/

      IF (IDUM.LT.0.OR.IFF.EQ.0) THEN
         IFF=1
         IX1=MOD(IC1-IDUM,M1)
         IX1=MOD(IA1*IX1+IC1,M1)
         IX2=MOD(IX1,M2)
         IX1=MOD(IA1*IX1+IC1,M1)
         IX3=MOD(IX1,M3)
         DO 11, J=1,97
           IX1=MOD(IA1*IX1+IC1,M1)
           IX2=MOD(IA2*IX2+IC2,M2)
           R(J)=(FLOAT(IX1)+FLOAT(IX2)*RM2)*RM1
 11      CONTINUE
         IDUM=1

       ENDIF

       IX1=MOD(IA1*IX1+IC1,M1)
       IX2=MOD(IA2*IX2+IC2,M2)
       IX3=MOD(IA3*IX3+IC3,M3)
       
       J=1+(97*IX3)/M3
       
*       IF (J.GT.97.OR.J.LT.1) PAUSE

       RAN=R(J)  


       R(J)=(FLOAT(IX1)+FLOAT(IX2)*RM2)*RM1

       RETURN
       END
*
*
