/* * UCW Library -- Unbiased Random Numbers * * (c) 1998--2006 Martin Mares * (c) 2020 Pavel Charvat * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. */ #include #include #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); void random_set_seed(uint seed) { srandom(seed); } uint random_gen_seed(void) { uint seed = fastrand_gen_seed_value(); random_set_seed(seed); return seed; } uint random_u32(void) { return (random() & 0xffff) | ((random() & 0xffff) << 16); } uint random_max(uint max) { uint 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; }