00001 SUBROUTINE RANMAR(RVEC,LENV) 00002 C ---------------------------------------------------------------------- 00003 C<<<<<FUNCTION RANMAR(IDUMM) 00004 C CERNLIB V113, VERSION WITH AUTOMATIC DEFAULT INITIALIZATION 00005 C Transformed to SUBROUTINE to be as in CERNLIB 00006 C AM.Lutz November 1988, Feb. 1989 00007 C 00008 C!Universal random number generator proposed by Marsaglia and Zaman 00009 C in report FSU-SCRI-87-50 00010 C modified by F. James, 1988 and 1989, to generate a vector 00011 C of pseudorandom numbers RVEC of length LENV, and to put in 00012 C the COMMON block everything needed to specify currrent state, 00013 C and to add input and output entry points RMARIN, RMARUT. 00014 C 00015 C Unique random number used in the program 00016 C ---------------------------------------------------------------------- 00017 COMMON / INOUT / INUT,IOUT 00018 DIMENSION RVEC(*) 00019 COMMON/RASET1/U(97),C,I97,J97 00020 PARAMETER (MODCNS=1000000000) 00021 DATA NTOT,NTOT2,IJKL/-1,0,0/ 00022 C 00023 IF (NTOT .GE. 0) GO TO 50 00024 C 00025 C Default initialization. User has called RANMAR without RMARIN. 00026 IJKL = 54217137 00027 NTOT = 0 00028 NTOT2 = 0 00029 KALLED = 0 00030 GO TO 1 00031 C 00032 ENTRY RMARIN(IJKLIN, NTOTIN,NTOT2N) 00033 C Initializing routine for RANMAR, may be called before 00034 C generating pseudorandom numbers with RANMAR. The input 00035 C values should be in the ranges: 0<=IJKLIN<=900 OOO OOO 00036 C 0<=NTOTIN<=999 999 999 00037 C 0<=NTOT2N<<999 999 999! 00038 C To get the standard values in Marsaglia-s paper, IJKLIN=54217137 00039 C NTOTIN,NTOT2N=0 00040 IJKL = IJKLIN 00041 NTOT = MAX(NTOTIN,0) 00042 NTOT2= MAX(NTOT2N,0) 00043 KALLED = 1 00044 C always come here to initialize 00045 1 CONTINUE 00046 IJ = IJKL/30082 00047 KL = IJKL - 30082*IJ 00048 I = MOD(IJ/177, 177) + 2 00049 J = MOD(IJ, 177) + 2 00050 K = MOD(KL/169, 178) + 1 00051 L = MOD(KL, 169) 00052 WRITE(IOUT,201) IJKL,NTOT,NTOT2 00053 201 FORMAT(1X,' RANMAR INITIALIZED: ',I10,2X,2I10) 00054 DO 2 II= 1, 97 00055 S = 0. 00056 T = .5 00057 DO 3 JJ= 1, 24 00058 M = MOD(MOD(I*J,179)*K, 179) 00059 I = J 00060 J = K 00061 K = M 00062 L = MOD(53*L+1, 169) 00063 IF (MOD(L*M,64) .GE. 32) S = S+T 00064 3 T = 0.5*T 00065 2 U(II) = S 00066 TWOM24 = 1.0 00067 DO 4 I24= 1, 24 00068 4 TWOM24 = 0.5*TWOM24 00069 C = 362436.*TWOM24 00070 CD = 7654321.*TWOM24 00071 CM = 16777213.*TWOM24 00072 I97 = 97 00073 J97 = 33 00074 C Complete initialization by skipping 00075 C (NTOT2*MODCNS + NTOT) random numbers 00076 DO 45 LOOP2= 1, NTOT2+1 00077 NOW = MODCNS 00078 IF (LOOP2 .EQ. NTOT2+1) NOW=NTOT 00079 IF (NOW .GT. 0) THEN 00080 WRITE (IOUT,'(A,I15)') ' RMARIN SKIPPING OVER ',NOW 00081 DO 40 IDUM = 1, NTOT 00082 UNI = U(I97)-U(J97) 00083 IF (UNI .LT. 0.) UNI=UNI+1. 00084 U(I97) = UNI 00085 I97 = I97-1 00086 IF (I97 .EQ. 0) I97=97 00087 J97 = J97-1 00088 IF (J97 .EQ. 0) J97=97 00089 C = C - CD 00090 IF (C .LT. 0.) C=C+CM 00091 40 CONTINUE 00092 ENDIF 00093 45 CONTINUE 00094 IF (KALLED .EQ. 1) RETURN 00095 C 00096 C Normal entry to generate LENV random numbers 00097 50 CONTINUE 00098 DO 100 IVEC= 1, LENV 00099 UNI = U(I97)-U(J97) 00100 IF (UNI .LT. 0.) UNI=UNI+1. 00101 U(I97) = UNI 00102 I97 = I97-1 00103 IF (I97 .EQ. 0) I97=97 00104 J97 = J97-1 00105 IF (J97 .EQ. 0) J97=97 00106 C = C - CD 00107 IF (C .LT. 0.) C=C+CM 00108 UNI = UNI-C 00109 IF (UNI .LT. 0.) UNI=UNI+1. 00110 C Replace exact zeroes by uniform distr. *2**-24 00111 IF (UNI .EQ. 0.) THEN 00112 UNI = TWOM24*U(2) 00113 C An exact zero here is very unlikely, but lets be safe. 00114 IF (UNI .EQ. 0.) UNI= TWOM24*TWOM24 00115 ENDIF 00116 RVEC(IVEC) = UNI 00117 100 CONTINUE 00118 NTOT = NTOT + LENV 00119 IF (NTOT .GE. MODCNS) THEN 00120 NTOT2 = NTOT2 + 1 00121 NTOT = NTOT - MODCNS 00122 ENDIF 00123 RETURN 00124 C Entry to output current status 00125 ENTRY RMARUT(IJKLUT,NTOTUT,NTOT2T) 00126 IJKLUT = IJKL 00127 NTOTUT = NTOT 00128 NTOT2T = NTOT2 00129 RETURN 00130 END