25 lines
466 B
C
25 lines
466 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;
|
|
}
|