#include #include #define SEED1 19660809UL #define SEED2 2552272502UL #define SEED3 1730193407UL #define SEED4 2810126836UL #define SEED5 2043670885UL /*============================================================*/ /* A sample program for Pseudo-random number generator */ /* by means of irrational rotation */ /* with m=90 and the irrational number (sqrt(5)-1)/2. */ /* */ /* This program outputs a random {0,1}-sequence */ /* */ /* 110110011011010001001111110011 */ /*============================================================*/ #define LIMIT 0x3fffffff #define CARRY 0x40000000 static unsigned long omega[5]; /* Current seeds */ void m90setseeds(unsigned long s0, unsigned long s1, unsigned long s2, unsigned long s3, unsigned long s4) /* Initialization */ { omega[0] = s0 & LIMIT; omega[1] = s1 & LIMIT; omega[2] = s2 & LIMIT; omega[3] = s3 & LIMIT; omega[4] = s4 & LIMIT; } char m90randombit() /* Returns 0 or 1 at random */ { static unsigned long alpha[5] = { /* Data of (sqrt(5)-1)/2 */ 0x278dde6e, 0x17f4a7c1, 0x17ce7301, 0x205cedc8, 0x0d042089 }; char data_byte; union bitarray { unsigned long of_32bits; char of_8bits[4]; } data_bitarray; int j; for (j=4; j>=1; ){ omega[j] += alpha[j]; if ( omega[j] & CARRY ){ omega[j] &= LIMIT; omega[--j]++; } else --j; } omega[0] += alpha[0]; omega[0] &= LIMIT; data_bitarray.of_32bits = omega[0] ^ omega[1] ^ omega[2]; data_byte = data_bitarray.of_8bits[0] ^ data_bitarray.of_8bits[1] ^ data_bitarray.of_8bits[2] ^ data_bitarray.of_8bits[3]; data_byte ^= ( data_byte >> 4 ); data_byte ^= ( data_byte >> 2 ); data_byte ^= ( data_byte >> 1 ); return( 1 & data_byte ); } long m90random31() { int j; unsigned long b=0; for (j=0; j<30; j++) { b |=m90randombit(); b <<= 1; } b |=m90randombit(); return b; } void init_m90random(unsigned long s) { int i; unsigned long x[5]; x[0] = s = s & 0xffffffffUL; for( i=1; i<5; i++) { s = 1664525UL * s + 1UL; x[i] = s = s & 0xffffffffUL; } m90setseeds(x[0], x[1], x[2], x[3], x[4]); } int main(int argc, char* argv[]) { long r; int i; int cnum = 10; int nodisp = 0; if (argc > 1) { cnum = atoi(argv[1]); } if (argc > 2) { nodisp = atoi(argv[2]); } m90setseeds(SEED1, SEED2, SEED3, SEED4, SEED5); if (nodisp) { for (i = 0; i < cnum; i++) { r = m90random31(); } } else { for (i = 0; i < cnum; i++) { r = m90random31(); printf("%d\n", r); } } return 0; }