33 lines
682 B
C
33 lines
682 B
C
#pragma once
|
|
|
|
#include "misc_utils.h"
|
|
#include <stdint.h>
|
|
|
|
typedef struct {
|
|
uint32_t state;
|
|
} RandomEngine;
|
|
|
|
static void RandomEngine_init(RandomEngine *self) { self->state = 0x6d2b79f5u; }
|
|
|
|
static uint32_t RandomEngine_rnd(RandomEngine *self) {
|
|
uint32_t x = self->state;
|
|
|
|
if (x == 0) {
|
|
x = 0x6d2b79f5u;
|
|
}
|
|
|
|
x ^= x << 13;
|
|
x ^= x >> 17;
|
|
x ^= x << 5;
|
|
x = x * 1664525u + 1013904223u;
|
|
|
|
self->state = x;
|
|
return x;
|
|
}
|
|
|
|
static uint32_t RandomEngine_rnd_interval(RandomEngine *self, uint32_t from,
|
|
uint32_t until) {
|
|
check(from < until);
|
|
return from + RandomEngine_rnd(self) % (until - from);
|
|
}
|