diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 33 |
1 files changed, 33 insertions, 0 deletions
@@ -31,3 +31,36 @@ xrealloc(void *ptr, size_t size) } return ret; } + +// Based on sample rand() implementation from POSIX.1-2001 + +static unsigned long xrand_next = 0; + +void xsrand(unsigned int seed) { + xrand_next = seed; +} + +static unsigned int xrand_simple(void) { + xrand_next = xrand_next*1103515245 + 12345; + return (unsigned int)(xrand_next/65536)%32768; +} + +static unsigned int xrand_full(void) { + unsigned int low = xrand_simple(); + unsigned int high = xrand_simple(); + return low | (high << 15); +} + +#define XRAND_RANGE 1073741824U + +unsigned int +xrand(unsigned int range) +{ + // Compensate for bias if XRAND_RANGE isn't a multiple of range + unsigned int limit = XRAND_RANGE - XRAND_RANGE%range; + unsigned int res; + do { + res = xrand_full(); + } while (res >= limit); + return res%range; +} |