Gerador de números aleatórios

----------------------------------------
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