#include #include #include #include #include #include #include struct rngstate{ uint64_t state[16]; int idx; }; static struct rngstate global_rng_state; void init_rng(){ uint64_t seed_val = (uint64_t)SEED_VAL; size_t c_idx = 0; for ( ; c_idx < 16; c_idx++ ){ seed_val = seed_val * 0x13371337; seed_val = seed_val ^ (seed_val >> 16); global_rng_state.state[c_idx] = seed_val; } return; } uint64_t get_rng_output(){ int c_idx = global_rng_state.idx; const uint64_t next_state = global_rng_state.state[c_idx++]; uint64_t use_state = global_rng_state.state[c_idx &= 15]; use_state ^= use_state << 31; use_state ^= use_state >> 16; use_state ^= next_state ^ (next_state >> 31); global_rng_state.state[c_idx] = use_state; global_rng_state.idx = c_idx; return use_state * 0x1337; } unsigned int get_random_int( unsigned int min, unsigned int max ){ if ( min >= max ) return min; uint64_t nmax = 0xffffffffffffffff; uint64_t ncount = (max - min) + 1; uint64_t upper_limit = nmax - (nmax % ncount); uint64_t rand_int = get_rng_output(); if ( rand_int > upper_limit ){ while ( rand_int > upper_limit ) rand_int = get_rng_output(); } return (unsigned int)(rand_int % max) + min; }