Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I9d8998707c02e64cf177a6eeb51e399e6a6a6964
22 lines
542 B
C
22 lines
542 B
C
#include "rng.h"
|
|
|
|
// Linear congruential generator (LCG) state
|
|
static unsigned int g_seed = 1;
|
|
|
|
// LCG parameters (from numerical recipes)
|
|
#define LCG_A 1664525
|
|
#define LCG_C 1013904223
|
|
#define LCG_MOD 4294967294 // 2^32 - 2 (avoid 0)
|
|
|
|
void rng_seed(unsigned int seed) {
|
|
// Ensure seed is never 0
|
|
g_seed = (seed == 0) ? 1 : seed;
|
|
}
|
|
|
|
int rng_int(int min, int max) {
|
|
// Generate next value
|
|
g_seed = (LCG_A * g_seed + LCG_C) % LCG_MOD;
|
|
|
|
// Map to [min, max] range
|
|
return min + (int)((unsigned long long)g_seed % (max - min + 1));
|
|
}
|