X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Frandom.c;h=a771c97ae624a2dd83bda57c95c062e316b77108;hb=e772e1bde20eb3866ecb7c63d2276b3ae4ea95d5;hp=7f88489d7cd00cf1c0d1721c6cfa38d2ce601244;hpb=cad27e97e6370f96903d42aaf345c099af0a03bd;p=libucw.git diff --git a/lib/random.c b/lib/random.c index 7f88489d..a771c97a 100644 --- a/lib/random.c +++ b/lib/random.c @@ -1,7 +1,7 @@ /* - * UCW Library -- Unbiased Range Correction for random() + * UCW Library -- Unbiased Random Numbers * - * (c) 1998 Martin Mares + * (c) 1998--2006 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -11,14 +11,48 @@ #include +/* We expect the random generator in libc to give at least 30 bits of randomness */ +COMPILE_ASSERT(RAND_MAX_RANGE_TEST, RAND_MAX >= (1 << 30)-1); + +uns +random_u32(void) +{ + return (random() & 0xffff) | ((random() & 0xffff) << 16); +} + uns random_max(uns max) { uns r, l; + ASSERT(max <= (1 << 30)); l = (RAND_MAX + 1U) - ((RAND_MAX + 1U) % max); do r = random(); while (r >= l); return r % max; } + +u64 +random_u64(void) +{ + return + ((u64)(random() & 0xffff) << 48) | + ((u64)(random() & 0xffffff) << 24) | + (random() & 0xffffff); +} + +u64 +random_max_u64(u64 max) +{ + if (max < (1 << 30)) + return random_max(max); + + u64 r, l, m; + m = 0xffffffffffffffff; + l = m - (m % max); + do + r = random_u64(); + while (r >= l); + return r % max; +}