/* Reference Code of a Random Number Generator Combined Tausworthe : (31,13,12), (29,2,4), (28,3,17) JIS Z 9031:2012, pp.54-55 */ static unsigned long s1, s2, s3, b; void init_taus88(unsigned long s){ int i; unsigned long x[3]; s &= 0xffffffffUL; i = 0; while (i < 3) { if (s & 0xfffffff0UL) { x[i] = s; i++; } s = 1664525UL * s + 1UL; s &= 0xffffffffUL; } s1 = x[0]; s2 = x[1]; s3 = x[2]; } /* 31 bit integer */ long taus88_31(void){ b = (((s1 << 13) ^ s1) >> 19); s1 = (((s1 & 4294967294UL) << 12) ^ b); b = (((s2 << 2) ^ s2) >> 25); s2 = (((s2 & 4294967288UL) << 4) ^ b); b = (((s3 << 3) ^ s3) >> 11); s3 = (((s3 & 4294967280UL) << 17) ^ b); return ((s1 ^ s2 ^ s3) >> 1); } void random_generator_reference_init(unsigned int s){ init_taus88(s); } unsigned int random_generator_reference(void){ return taus88_31(); }