/** ------------------------------------------------------------------------------ Rand.java: By Bob Jenkins. My random number generator, ISAAC. rand.init() -- initialize rand.val() -- get a random value MODIFIED: 960327: Creation (addition of randinit, really) 970719: use context, not global variables, for internal state 980224: Translate to Java ------------------------------------------------------------------------------ */ public class Rand { final static int SIZEL = 8; /* log of size of rsl[] and mem[] */ final static int SIZE = 1<>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a>>>6; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a<<2; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a>>>16; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; } for (j=0; j>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a>>>6; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a<<2; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; x = mem[i]; a ^= a>>>16; a += mem[j++]; mem[i] = y = mem[(x&MASK)>>2] + a + b; rsl[i++] = b = mem[((y>>SIZEL)&MASK)>>2] + x; } } /* initialize, or reinitialize, this instance of rand */ public final void Init(boolean flag) { int i; int a,b,c,d,e,f,g,h; a=b=c=d=e=f=g=h=0x9e3779b9; /* the golden ratio */ for (i=0; i<4; ++i) { a^=b<<11; d+=a; b+=c; b^=c>>>2; e+=b; c+=d; c^=d<<8; f+=c; d+=e; d^=e>>>16; g+=d; e+=f; e^=f<<10; h+=e; f+=g; f^=g>>>4; a+=f; g+=h; g^=h<<8; b+=g; h+=a; h^=a>>>9; c+=h; a+=b; } for (i=0; i>>2; e+=b; c+=d; c^=d<<8; f+=c; d+=e; d^=e>>>16; g+=d; e+=f; e^=f<<10; h+=e; f+=g; f^=g>>>4; a+=f; g+=h; g^=h<<8; b+=g; h+=a; h^=a>>>9; c+=h; a+=b; mem[i ]=a; mem[i+1]=b; mem[i+2]=c; mem[i+3]=d; mem[i+4]=e; mem[i+5]=f; mem[i+6]=g; mem[i+7]=h; } if (flag) { /* second pass makes all of seed affect all of mem */ for (i=0; i>>2; e+=b; c+=d; c^=d<<8; f+=c; d+=e; d^=e>>>16; g+=d; e+=f; e^=f<<10; h+=e; f+=g; f^=g>>>4; a+=f; g+=h; g^=h<<8; b+=g; h+=a; h^=a>>>9; c+=h; a+=b; mem[i ]=a; mem[i+1]=b; mem[i+2]=c; mem[i+3]=d; mem[i+4]=e; mem[i+5]=f; mem[i+6]=g; mem[i+7]=h; } } Isaac(); count = SIZE; } /* Call rand.val() to get a random value */ public final int val() { if (0 == count--) { Isaac(); count = SIZE-1; } return rsl[count]; } public static void main(String[] args) { int seed[] = new int[256]; Rand x = new Rand(seed); for (int i=0; i<2; ++i) { x.Isaac(); for (int j=0; j