/* isaac.c - Don Yang (uguu.org) Original: http://burtleburtle.net/bob/rand/isaacafa.html 07/29/12 */ #include #include typedef unsigned int ub4; static ub4 result[256], result_count = 0; static ub4 mm[256], aa = 0, bb = 0, cc = 0; static ub4 Isaac(void) { ub4 i, x, y; if( result_count-- == 0 ) { cc++; bb += cc; for(i = 0; i < 256; i++) { x = mm[i]; #if 0 switch( i & 3 ) { case 0: aa ^= (aa << 13); break; case 1: aa ^= (aa >> 6); break; case 2: aa ^= (aa << 2); break; case 3: aa ^= (aa >> 16); break; } #else aa ^= (i & 1) ? aa >> ((i & 2) ? 16 : 6) : aa << ((i & 2) ? 2 : 13); #endif aa += mm[(i + 128) & 255]; mm[i] = y = mm[(x >> 2) & 255] + aa + bb; result[i] = bb = mm[(y >> 10) & 255] + x; } result_count = 255; } return result[result_count]; } int main(void) { int i; memset(mm, 0, sizeof(mm)); for(i = 0; i < 256 * 10; i++) Isaac(); printf("aa=%08x bb=%08x cc=%08x\n", aa, bb, cc); for(i = 0; i < (1 << 27); i++) Isaac(); for(i = 0; i < 256; i++) printf("%08x\n", Isaac()); return 0; }