25 #include <utils_rng.h> 27 static const uint64_t a = 0x5deece66dULL;
28 static const uint64_t c = 0xb;
29 static const uint64_t m = 1ULL << 48;
31 void utils_rng_init(
struct utils_rng *rng, uint64_t seed)
33 rng->seed = (seed ^ a) % m;
36 uint32_t utils_rng_gen32(
struct utils_rng *rng)
39 next = (a * rng->seed + c) % m;
44 double utils_rng_gend(
struct utils_rng *rng)
48 (((uint64_t) utils_rng_gen32(rng) >> 6) << 27) +
49 (utils_rng_gen32(rng) >> 5);
50 return x / ((double) (1ULL << 53));
53 void utils_rng_gen(
struct utils_rng *rng,
void *buf,
size_t size)
57 * ((uint32_t *) buf) = utils_rng_gen32(rng);
58 buf = (
void*) ((uintptr_t) buf + 4);
62 x = utils_rng_gen32(rng);
64 * ((uint8_t *) buf) = x >> 24;
66 buf = (
void*) ((uintptr_t) buf + 1);