/* Call rand(rk_isaac_state *r) to retrieve a single 32-bit random value */ unsigned long rk_isaac_random(rk_isaac_state *state) { if (!state->randcnt--) { register unsigned long a,b,x,y,*m,*mm,*m2,*r,*mend; mm=state->randmem; r=state->randrsl; a = state->randa; b = (state->randb + (++state->randc)) & 0xffffffff; for (m = mm, mend = m2 = m+(RK_ISAAC_STATE_LEN/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); } state->randb = b; state->randa = a; state->randcnt=RK_ISAAC_STATE_LEN-1; } return state->randrsl[state->randcnt] & 0xFFFFFFFF; }
void isaac64(void) { register u64 a,b,x,y,*m,*m2,*r,*mend; m = mm; r = RandResult; a = aa; b = bb + (++cc); for (m = mm, mend = m2 = m+(RANDSIZ/2); m<mend; ) { rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x); rngstep( a^(a>>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<mend; ) { rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x); rngstep( a^(a>>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; }
void isaac(randctx *ctx) { register ub4 a,b,x,y,*m,*mm,*m2,*r,*mend; mm=ctx->randmem; r=ctx->randrsl; a = ctx->randa; b = ctx->randb + (++ctx->randc); 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); } ctx->randb = b; ctx->randa = a; }
void QTIsaac<ALPHA,T>::isaac(randctx* ctx) { T x,y; T* mm = ctx->randmem; T* r = ctx->randrsl; T a = (ctx->randa); T b = (ctx->randb + (++ctx->randc)); T* m = mm; T* m2 = (m+(N/2)); T* mend = m2; for(; m<mend; ) { #ifndef __ISAAC64 rngstep((a<<13), a, b, mm, m, m2, r, x, y); rngstep((a>>6) , a, b, mm, m, m2, r, x, y); rngstep((a<<2) , a, b, mm, m, m2, r, x, y); rngstep((a>>16), a, b, mm, m, m2, r, x, y); #else // __ISAAC64 rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x, y); rngstep( a^(a>>5) , a, b, mm, m, m2, r, x, y); rngstep( a^(a<<12) , a, b, mm, m, m2, r, x, y); rngstep( a^(a>>33) , a, b, mm, m, m2, r, x, y); #endif // __ISAAC64 } m2 = mm; for(; m2<mend; ) { #ifndef __ISAAC64 rngstep((a<<13), a, b, mm, m, m2, r, x, y); rngstep((a>>6) , a, b, mm, m, m2, r, x, y); rngstep((a<<2) , a, b, mm, m, m2, r, x, y); rngstep((a>>16), a, b, mm, m, m2, r, x, y); #else // __ISAAC64 rngstep(~(a^(a<<21)), a, b, mm, m, m2, r, x, y); rngstep( a^(a>>5) , a, b, mm, m, m2, r, x, y); rngstep( a^(a<<12) , a, b, mm, m, m2, r, x, y); rngstep( a^(a>>33) , a, b, mm, m, m2, r, x, y); #endif // __ISAAC64 } ctx->randb = b; ctx->randa = a; }