diff options
Diffstat (limited to 'lib/RandISAAC.cc')
-rw-r--r-- | lib/RandISAAC.cc | 179 |
1 files changed, 108 insertions, 71 deletions
diff --git a/lib/RandISAAC.cc b/lib/RandISAAC.cc index 2b0b09b..021bf20 100644 --- a/lib/RandISAAC.cc +++ b/lib/RandISAAC.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: RandISAAC.cc,v 1.1 2008-07-18 14:01:49 pixel Exp $ */ +/* $Id: RandISAAC.cc,v 1.2 2008-07-18 14:05:39 pixel Exp $ */ /* Based on ISAAC. See original (C) mention below. */ @@ -53,28 +53,30 @@ MODIFIED: *(r++) = b = (ind(mm,y>>RANDSIZL) + x) & 0xffffffff; \ } -void Random::isaac() { - Uint32 a,b,x,y,*m,*mm,*m2,*r,*mend; - mm=randmem; r=randrsl; - a = randa; b = (randb + (++randc)) & 0xffffffff; - for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; ) - { - rngstep( a<<13, a, b, mm, m, m2, r, x); - rngstep( a>>6 , a, b, mm, m, m2, r, x); - rngstep( a<<2 , a, b, mm, m, m2, r, x); - rngstep( a>>16, a, b, mm, m, m2, r, x); - } - for (m2 = mm; m2<mend; ) - { - rngstep( a<<13, a, b, mm, m, m2, r, x); - rngstep( a>>6 , a, b, mm, m, m2, r, x); - rngstep( a<<2 , a, b, mm, m, m2, r, x); - rngstep( a>>16, a, b, mm, m, m2, r, x); - } - randb = b; randa = a; +void Random::isaac() +{ + Uint32 a, b, x, y, *m, *mm, *m2, *r, *mend; + + mm = randmem; + r = randrsl; + a = randa; + b = (randb + (++randc)) & 0xffffffff; + for (m = mm, mend = m2 = m + (RANDSIZ / 2); m < mend;) { + rngstep(a << 13, a, b, mm, m, m2, r, x); + rngstep(a >> 6, a, b, mm, m, m2, r, x); + rngstep(a << 2, a, b, mm, m, m2, r, x); + rngstep(a >> 16, a, b, mm, m, m2, r, x); + } + for (m2 = mm; m2 < mend;) { + rngstep(a << 13, a, b, mm, m, m2, r, x); + rngstep(a >> 6, a, b, mm, m, m2, r, x); + rngstep(a << 2, a, b, mm, m, m2, r, x); + rngstep(a >> 16, a, b, mm, m, m2, r, x); + } + randb = b; + randa = a; } - #define mix(a,b,c,d,e,f,g,h) \ { \ a^=b<<11; d+=a; b+=c; \ @@ -87,60 +89,95 @@ void Random::isaac() { h^=a>>9; c+=h; a+=b; \ } -/* if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. */ -void Random::randinit(int flag) { - int i; - Uint32 a,b,c,d,e,f,g,h; - Uint32 *m,*r; - randa = randb = randc = 0; - m=randmem; - r=randrsl; - a=b=c=d=e=f=g=h=0x9e3779b9; /* the golden ratio */ - - for (i=0; i<4; ++i) /* scramble it */ - { - mix(a,b,c,d,e,f,g,h); - } - - if (flag) - { - /* initialize using the contents of r[] as the seed */ - for (i=0; i<RANDSIZ; i+=8) - { - a+=r[i ]; b+=r[i+1]; c+=r[i+2]; d+=r[i+3]; - e+=r[i+4]; f+=r[i+5]; g+=r[i+6]; h+=r[i+7]; - mix(a,b,c,d,e,f,g,h); - m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; - m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; - } - /* do a second pass to make all of the seed affect all of m */ - for (i=0; i<RANDSIZ; i+=8) - { - a+=m[i ]; b+=m[i+1]; c+=m[i+2]; d+=m[i+3]; - e+=m[i+4]; f+=m[i+5]; g+=m[i+6]; h+=m[i+7]; - mix(a,b,c,d,e,f,g,h); - m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; - m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; - } - } - else - { - for (i=0; i<RANDSIZ; i+=8) - { - /* fill in mm[] with messy stuff */ - mix(a,b,c,d,e,f,g,h); - m[i ]=a; m[i+1]=b; m[i+2]=c; m[i+3]=d; - m[i+4]=e; m[i+5]=f; m[i+6]=g; m[i+7]=h; - } - } - - isaac(); /* fill in the first set of results */ - randcnt=RANDSIZ; /* prepare to use the first set of results */ +/* + * if (flag==TRUE), then use the contents of randrsl[] to initialize mm[]. + */ +void Random::randinit(int flag) +{ + int i; + + Uint32 a, b, c, d, e, f, g, h; + + Uint32 *m, *r; + + randa = randb = randc = 0; + m = randmem; + r = randrsl; + a = b = c = d = e = f = g = h = 0x9e3779b9; /* the golden ratio */ + + for (i = 0; i < 4; ++i) { /* scramble it */ + mix(a, b, c, d, e, f, g, h); + } + + if (flag) { + /* + * initialize using the contents of r[] as the seed + */ + for (i = 0; i < RANDSIZ; i += 8) { + a += r[i]; + b += r[i + 1]; + c += r[i + 2]; + d += r[i + 3]; + e += r[i + 4]; + f += r[i + 5]; + g += r[i + 6]; + h += r[i + 7]; + mix(a, b, c, d, e, f, g, h); + m[i] = a; + m[i + 1] = b; + m[i + 2] = c; + m[i + 3] = d; + m[i + 4] = e; + m[i + 5] = f; + m[i + 6] = g; + m[i + 7] = h; + } + /* + * do a second pass to make all of the seed affect all of m + */ + for (i = 0; i < RANDSIZ; i += 8) { + a += m[i]; + b += m[i + 1]; + c += m[i + 2]; + d += m[i + 3]; + e += m[i + 4]; + f += m[i + 5]; + g += m[i + 6]; + h += m[i + 7]; + mix(a, b, c, d, e, f, g, h); + m[i] = a; + m[i + 1] = b; + m[i + 2] = c; + m[i + 3] = d; + m[i + 4] = e; + m[i + 5] = f; + m[i + 6] = g; + m[i + 7] = h; + } + } else { + for (i = 0; i < RANDSIZ; i += 8) { + /* + * fill in mm[] with messy stuff + */ + mix(a, b, c, d, e, f, g, h); + m[i] = a; + m[i + 1] = b; + m[i + 2] = c; + m[i + 3] = d; + m[i + 4] = e; + m[i + 5] = f; + m[i + 6] = g; + m[i + 7] = h; + } + } + + isaac(); /* fill in the first set of results */ + randcnt = RANDSIZ; /* prepare to use the first set of results */ } Random::Random() { int i; - + srand(time(NULL)); for (i = 0; i < RANDSIZ; i++) { randrsl[i] = rand(); |