----------------------------------------
C:
----------------------------------------
----------------------------------------
FORTRAN:
----------------------------------------
C:
----------------------------------------
double ran1(long int *idum){ const long int IA = 16807, IM = 2147483647, IQ = 127773, IR = 2836, NTAB = 32, NDIV = (1+(IM-1)/NTAB); const double AM = (1.0/IM), EPS = 1.2e-7, RNMX = (1.0-EPS); static long int iy=0, iv[NTAB]; int j, k; double temp; if(*idum <= 0 || !iy){ if (-(*idum) < 1) *idum = 1; else *idum = -(*idum); for(j = NTAB + 7; j >= 0; j--){ k = (*idum) / IQ; *idum = IA * (*idum - k * IQ) - IR * k; if(*idum < 0) *idum += IM; if(j < NTAB) iv[j] = *idum; } iy = iv[0]; } k = (*idum) / IQ; *idum = IA * (*idum - k * IQ) - IR * k; if(*idum < 0) *idum += IM; j = iy / NDIV; iy = iv[j]; iv[j] = *idum; if((temp=AM*iy) > RNMX) return RNMX; else return temp; }
----------------------------------------
FORTRAN:
----------------------------------------
FUNCTION ran1(idum) INTEGER(8), PARAMETER :: IA = 16807, IM = 2147483647, IQ = 127773, & IR = 2836, NTAB = 32, NDIV = (1+(IM-1)/NTAB) REAL(8), PARAMETER :: AM = (1.0d0/real(IM)), EPS = 1.2d-7, & RNMX = (1.0d0-EPS) INTEGER(8), intent(inout) :: idum INTEGER(8) :: j, i, k, iv(NTAB), iy REAL(8) :: ran1 SAVE iv, iy DATA iv /NTAB*0/, iy /0/ IF(idum .le. 0 .or. iy .eq. 0) THEN idum = MAX(-idum, 1) DO j = NTAB + 8, 1, -1 k = idum / IQ idum = IA * (idum - k * IQ) - IR * k IF(idum .lt. 0) idum = idum + IM IF(j .le. NTAB) iv(j) = idum END DO iy = iv(1) END IF k = idum / IQ idum = IA * (idum - k * IQ) - IR * k IF(idum .lt. 0) idum = idum + IM j = 1 + iy / NDIV iy = iv(j) iv(j) = idum ran1 = MIN(AM*iy, RNMX) RETURN END FUNCTION ran1