#define NTAB 32
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
#define IM1 2147483563
#define IM2 2147483399
#define AM1 (1.0/IM1)
#define IMM1 (IM1-1)
#define IA1 40014
#define IA2 40392
#define IQ1 53668
#define IQ2 52774
#define IR1 12211
#define IR2 3791
#define NDIV1 (1+IMM1/NTAB)

double rand2(long *idum)  /* A great random number generator which */
                         /* unfortunately also takes about twice as long */
                         /* as rand1 to run. Also initialised with a */ 
                         /*pointer to a *negative* interger. */
{
  int j;
  long k;
  static long idum2=123456789;
  static long iy=0;
  static long iv[NTAB];
  double temp;

  if (*idum <= 0) {             /* Initialise */
    if (-(*idum) < 1)*idum =1;  /* Prevents idum = 0 */
    else *idum = -(*idum);
    idum2=(*idum);
    for (j=NTAB+7;j>=0;j--) {   /* Load the shuffle table (after 8 warm-ups) */
      k=(*idum)/IQ1;
      *idum=IA1*(*idum-k*IQ1)-k*IR1;
      if (*idum <0) *idum += IM1;
      if (j < NTAB) iv[j] = *idum;
    }
    iy=iv[0];
  }
  k=(*idum)/IQ1;                 /* Start here when not initialising */
  *idum=IA1*(*idum-k*IQ1)-k*IR1; /* Compute idum=(IA1*idum)%IM1 without */
  if (*idum < 0) *idum += IM1;   /*   overflowing by Schrage's method */
  k=idum2/IQ1;
  idum2=IA2*(idum2-k*IQ2)-k*IR2; /* Compute idum2=(IA2*idum)%IM2 likewise */
  if (idum2 < 0) idum2 += IM2;
  j=iy/NDIV1;                    /* Will be in range 0..NTAB-1 */
  iy=iv[j]-idum2;                /* Here idum is shuffled, idum and idum2 */
  iv[j] = *idum;                 /*   are combined to generate output */
  if (iy < 1) iy += IMM1;
  if ((temp=AM1*iy)>RNMX) return RNMX; /* Users don't expect endpoint values */
  else return temp;
}
