/*============================================================================ (C)2006 Joachim Schueth, Bonn Some simple pseudo-random number generator. It produces 32-bit integers in the range 1 to 0xFFFFFFFA with a period length of 4294967290. ============================================================================*/ #include #include #include #include #include /* fun(x) = (48271 * x) mod (2**32 - 5) */ #define RMULT 48271L #define RMOD 0xfffffffbL unsigned long fun(unsigned long x) { unsigned long a, b, f; b = RMULT * (x & 0xffff); a = RMULT * (x >> 16); a += b >> 16; b &= 0xffff; b |= a << 16; f = b & 0x80000000L; a >>= 16; b += a; a <<= 2; b += a; if( f && !(b & 0x80000000L) ) b += 5; if( b > RMOD ) b -= RMOD; return b; } #define NBUF 1024 int main(int argc, char **argv) { unsigned long x, x0, n, buff[NBUF]; int k; if( argc != 3 || sscanf(argv[1], "%lu", &x0) != 1 || sscanf(argv[2], "%lu", &n) != 1 ) { fprintf(stderr, "Syntax: %s \n", *argv); exit(EINVAL); } for(k = 0, x = x0; n != 0; n--) { buff[k++] = htonl((long)x); if( k == NBUF ) { write(STDOUT_FILENO, buff, sizeof(buff)); k = 0; } x = fun(x); } if( k ) write(STDOUT_FILENO, buff, k * sizeof(*buff)); return 0; }