/* ------------------------------------------------------------------------------ isaac64.c: My random number generator for 64-bit machines. By Bob Jenkins, 1996. Public Domain. ------------------------------------------------------------------------------ */ # include # include # include # include # include #ifndef STANDARD #include "standard.h" #endif #ifndef ISAAC64 #include "isaac64.h" #endif extern ub8 randrsl[RANDSIZ], randcnt; static ub8 mm[RANDSIZ]; static ub8 aa=0, bb=0, cc=0; #define ind(mm,x) (*(ub8 *)((ub1 *)(mm) + ((x) & ((RANDSIZ-1)<<3)))) #define rngstep(mix,a,b,mm,m,m2,r,x) \ { \ x = *m; \ a = (mix) + *(m2++); \ *(m++) = y = ind(mm,x) + a + b; \ *(r++) = b = ind(mm,y>>RANDSIZL) + x; \ } void isaac64() { register ub8 a,b,x,y,*m,*m2,*r,*mend; m=mm; r=randrsl; a = aa; b = bb + (++cc); for (m = mm, mend = m2 = m+(RANDSIZ/2); m>5) , a, b, mm, m, m2, r, x); rngstep( a^(a<<12) , a, b, mm, m, m2, r, x); rngstep( a^(a>>33) , a, b, mm, m, m2, r, x); } for (m2 = mm; m2>5) , a, b, mm, m, m2, r, x); rngstep( a^(a<<12) , a, b, mm, m, m2, r, x); rngstep( a^(a>>33) , a, b, mm, m, m2, r, x); } bb = b; aa = a; } #define mix(a,b,c,d,e,f,g,h) \ { \ a-=e; f^=h>>9; h+=a; \ b-=f; g^=a<<9; a+=b; \ c-=g; h^=b>>23; b+=c; \ d-=h; a^=c<<15; c+=d; \ e-=a; b^=d>>14; d+=e; \ f-=b; c^=e<<20; e+=f; \ g-=c; d^=f>>17; f+=g; \ h-=d; e^=g<<14; g+=h; \ } void randinit(flag) word flag; { word i; ub8 a,b,c,d,e,f,g,h; aa=bb=cc=(ub8)0; a=b=c=d=e=f=g=h=0x9e3779b97f4a7c13LL; /* the golden ratio */ for (i=0; i<4; ++i) /* scramble it */ { mix(a,b,c,d,e,f,g,h); } for (i=0; i>32),(ub4)randrsl[j]); if ((j&3)==3) fprintf(f,"\n"); } } fclose(f); }