Page 214
C: Early Marsaglia Random Number Generator double rndm(long ss) //call with ss!=0 to seed, else with ss=0 static int nBits = 32; // set to # bits used for integers static long m1 = 2^{nBits-2} + 2^{nBits-2}-1; static long m[17]; // 17 components must be initialized static long i, j; long seed, k, k0, k1, j0, j1, m2 = $2^{nBits/2}; if( ss != 0 ) { if( ss < 0 ) ss = -ss; seed = ss % m1; if( seed % 2 == 0 ) seed = seed-1; k0 = 9069 % m2; k1 = 9069/m2; j0 = seed % m2; j1 = seed/m2; loop p = 0,1,...,16 seed = j0*k0; j1 = ((seed/m2)+j0*k1+j1*k0)% (m2/2); j0 = seed % m2; m[p] = j0+m2*j1; end loop i = 4; j=16; } k=m[i]-m[j]; if( k<0 ) k = k+m1; m[j] = k; i = i-1; if( i<0) i=16; j = j-1; if( j<0) i=16; return (double)k/m1;