/*============================================================================ (C)2006 Joachim Schueth, Bonn Some simple pseudo-random number generator. It produces 64-bit integers in the range 1 to 0xFFFFFFFFFFFFFFC4 with a period length of 18446744073709551556. ============================================================================*/ #include #include #include #include #include /* fun(x) = (3412215083 * x) mod (2**64 - 59) */ #define RMULT 3412215083LL #define RMOD 0xffffffffffffffc5LL unsigned long long fun(unsigned long long x) { unsigned long long a, b, f; b = RMULT * (x & 0xffffffffLL); a = RMULT * (x >> 32); a += b >> 32; b &= 0xffffffffLL; b |= a << 32; f = b & 0x8000000000000000LL; a >>= 32; b += 59LL * a; if( f && !(b & 0x8000000000000000LL) ) b += 59LL; if( b > RMOD ) b -= RMOD; return b; } #define NBUF 1024 int main(int argc, char **argv) { unsigned long long x, x0, n; unsigned long buff[NBUF]; int k; if( argc != 3 || sscanf(argv[1], "%llu", &x0) != 1 || sscanf(argv[2], "%llu", &n) != 1 ) { fprintf(stderr, "Syntax: %s \n", *argv); exit(EINVAL); } for(k = 0, x = x0; n != 0; n--) { buff[k++] = htonl((long)(x >> 32)); buff[k++] = htonl((long)(x & 0xffffffffLL)); 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; }