39template <UINT32 ALPHA = (8)>
44 typedef unsigned char byte;
76 enum {
N = (1<<ALPHA)};
80 virtual void isaac(randctx* ctx);
102template<UINT32 ALPHA>
109template<UINT32 ALPHA>
112 for(
int i = 0; i < N; i++)
114 m_rc.randrsl[i] = s != NULL ? s[i] : 0;
121 randinit(&m_rc,
true);
125template<UINT32 ALPHA>
128 return 0x7fffffff & (!m_rc.randcnt-- ?
129 (isaac(&m_rc), m_rc.randcnt=(N-1), m_rc.randrsl[m_rc.randcnt]) :
130 m_rc.randrsl[m_rc.randcnt]);
134template<UINT32 ALPHA>
155 shuffle(
a,
b,
c,d,e,
f,g,h);
162 for(i=0; i < N; i+=8)
164 a+=r[i ];
b+=r[i+1];
c+=r[i+2]; d+=r[i+3];
165 e+=r[i+4];
f+=r[i+5]; g+=r[i+6]; h+=r[i+7];
167 shuffle(
a,
b,
c,d,e,
f,g,h);
169 m[i ]=
a; m[i+1]=
b; m[i+2]=
c; m[i+3]=d;
170 m[i+4]=e; m[i+5]=
f; m[i+6]=g; m[i+7]=h;
175 for(i=0; i < N; i += 8)
177 a+=m[i ];
b+=m[i+1];
c+=m[i+2]; d+=m[i+3];
178 e+=m[i+4];
f+=m[i+5]; g+=m[i+6]; h+=m[i+7];
180 shuffle(
a,
b,
c,d,e,
f,g,h);
182 m[i ]=
a; m[i+1]=
b; m[i+2]=
c; m[i+3]=d;
183 m[i+4]=e; m[i+5]=
f; m[i+6]=g; m[i+7]=h;
190 shuffle(
a,
b,
c,d,e,
f,g,h);
192 m[i ]=
a; m[i+1]=
b; m[i+2]=
c; m[i+3]=d;
193 m[i+4]=e; m[i+5]=
f; m[i+6]=g; m[i+7]=h;
202template<UINT32 ALPHA>
205 return (*(
UINT32*)((
byte*)(
mm) + ((x) & ((N-1)<<2))));
209template<UINT32 ALPHA>
213 a = (
a^(mix)) + *(m2++);
214 *(m++) = y = ind(
mm,x) +
a +
b;
215 *(r++) =
b = ind(
mm,y>>ALPHA) + x;
219template<UINT32 ALPHA>
222 a^=
b<<11; d+=
a;
b+=
c;
225 d^=e>>16; g+=d; e+=
f;
226 e^=
f<<10; h+=e;
f+=g;
233template<UINT32 ALPHA>
250 rngstep((
a<<13),
a,
b,
mm, m, m2, r, x, y);
251 rngstep((
a>>6) ,
a,
b,
mm, m, m2, r, x, y);
252 rngstep((
a<<2) ,
a,
b,
mm, m, m2, r, x, y);
253 rngstep((
a>>16),
a,
b,
mm, m, m2, r, x, y);
260 rngstep((
a<<13),
a,
b,
mm, m, m2, r, x, y);
261 rngstep((
a>>6) ,
a,
b,
mm, m, m2, r, x, y);
262 rngstep((
a<<2) ,
a,
b,
mm, m, m2, r, x, y);
263 rngstep((
a>>16),
a,
b,
mm, m, m2, r, x, y);
virtual void isaac(randctx *ctx)
void rngstep(UINT32 mix, UINT32 &a, UINT32 &b, UINT32 *&mm, UINT32 *&m, UINT32 *&m2, UINT32 *&r, UINT32 &x, UINT32 &y)
UINT32 ind(UINT32 *mm, UINT32 x)
virtual void srand(UINT32 a=0, UINT32 b=0, UINT32 c=0, UINT32 *s=NULL)
QTIsaac(UINT32 a=0, UINT32 b=0, UINT32 c=0)
virtual void randinit(randctx *ctx, bool bUseSeed)
virtual void shuffle(UINT32 &a, UINT32 &b, UINT32 &c, UINT32 &d, UINT32 &e, UINT32 &f, UINT32 &g, UINT32 &h)
const UINT32 GOLDEN_RATIO