Random Number Generator
April 1, 2018 ยท View on GitHub
Random Number Generator
// RNG has 64-bit state
static uint32_t seed, i;
void rand_seed(uint32_t s){
seed = s;
i = 0;
}
uint32_t rand_int(){
uint32_t m = 0x5bd1e995;
uint32_t k = i++ * m;
seed = (k ^ (k >> 24) ^ (seed * m)) * m;
return seed ^ (seed >> 13);
}
double rand_num(){
uint64_t M1 = rand_int();
uint64_t M2 = rand_int();
uint64_t M = (M1 << 20) | (M2 >> 12); // 52 bit random number
union { uint64_t i; double d; } u = {
.i = UINT64_C(0x3FF) << 52 | M
};
return u.d - 1.0;
}
double rand_range(double start, double stop, double step){
double count = ceil((stop - start) / step);
return start + floor(rand_num() * count) * step;
}
void rand_getstate(uint32_t *state){
state[0] = seed;
state[1] = i;
}
void rand_setstate(const uint32_t *state){
seed = state[0];
i = state[1];
}