31 lines
569 B
C
31 lines
569 B
C
#include "random.h"
|
|
|
|
static uint32_t state = 1;
|
|
|
|
void set_random_seed(uint32_t seed) {
|
|
state = seed ? seed : 1;
|
|
}
|
|
|
|
uint32_t random_u32(void) {
|
|
state ^= state << 13;
|
|
state ^= state >> 17;
|
|
state ^= state << 5;
|
|
return state;
|
|
}
|
|
|
|
uint32_t random_range(uint32_t max) {
|
|
if (max == 0) return 0;
|
|
uint32_t threshold = (0xFFFFFFFFU / max) * max;
|
|
uint32_t r;
|
|
do {
|
|
r = random_u32();
|
|
} while (r >= threshold);
|
|
return r % max;
|
|
}
|
|
|
|
void advance_state(uint32_t n) {
|
|
for (uint32_t i = 0; i < n; i++) {
|
|
random_u32();
|
|
}
|
|
}
|