123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- package com.oblivm.backend.rand;
- class ISAACAlgorithm {
- private static final int SIZEL = 8;
- private static final int SIZE = 1 << SIZEL;
- private static final int MASK = (SIZE - 1) << 2;
- private int count;
- private int rsl[];
- private int mem[];
- private int a;
- private int b;
- private int c;
-
- ISAACAlgorithm() {
- mem = new int[SIZE];
- rsl = new int[SIZE];
- init(false);
- }
-
- ISAACAlgorithm(int[] seed) {
- mem = new int[SIZE];
- rsl = new int[SIZE];
-
-
-
-
- System.arraycopy(seed, 0, rsl, 0, (seed.length <= rsl.length) ? seed.length : rsl.length);
- init(true);
- }
-
- private final void isaac() {
- int i, x, y;
- b += ++c;
- for (i = 0; i < SIZE; ++i) {
- x = mem[i];
- switch (i & 3) {
- case 0:
- a ^= a << 13;
- break;
- case 1:
- a ^= a >>> 6;
- break;
- case 2:
- a ^= a << 2;
- break;
- case 3:
- a ^= a >>> 16;
- break;
- }
- a += mem[(i + SIZE / 2) & (SIZE - 1)];
- mem[i] = y = mem[((x) & MASK) >> 2] + a + b;
- rsl[i] = b = mem[((y >> SIZEL) & MASK) >> 2] + x;
- }
- }
-
- private 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;
- 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 < SIZE; i += 8) {
- if (flag) {
- a += rsl[i];
- b += rsl[i + 1];
- c += rsl[i + 2];
- d += rsl[i + 3];
- e += rsl[i + 4];
- f += rsl[i + 5];
- g += rsl[i + 6];
- h += rsl[i + 7];
- }
- 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;
- 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) {
- for (i = 0; i < SIZE; i += 8) {
- a += mem[i];
- b += mem[i + 1];
- c += mem[i + 2];
- d += mem[i + 3];
- e += mem[i + 4];
- f += mem[i + 5];
- g += mem[i + 6];
- h += mem[i + 7];
- 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;
- 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;
- }
-
- final int nextInt() {
- if (0 == count--) {
- isaac();
- count = SIZE - 1;
- }
- return (rsl[count]);
- }
-
- final void supplementSeed(int[] seed) {
- for (int i = 0; i < seed.length; i++)
- mem[i % mem.length] ^= seed[i];
- }
- }
|