#ifndef RANDOM_H #define RANDOM_H #include #include "chacha.h" #define RANDOM_CACHE_SIZE 256ULL #define RANDOM_RESEED_SIZE 256ULL * 1024 struct random_state { size_t index; size_t reseed; chacha_ctx ctx; uint8_t cache[RANDOM_CACHE_SIZE]; }; void random_state_init(struct random_state *state); uint16_t get_random_u16(struct random_state *state); uint16_t get_random_u16_uniform(struct random_state *state, uint16_t bound); uint64_t get_random_u64(struct random_state *state); uint64_t get_random_u64_uniform(struct random_state *state, uint64_t bound); #endif