diff options
Diffstat (limited to 'sys/base/rng/random.c')
-rw-r--r-- | sys/base/rng/random.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/sys/base/rng/random.c b/sys/base/rng/random.c new file mode 100644 index 0000000..bd1bd6b --- /dev/null +++ b/sys/base/rng/random.c @@ -0,0 +1,33 @@ +#include "internal.h" + +static uint64 +xoshiro256ss(Rng *state) +{ + uint64 *s = state->s; + uint64 result = rol64(s[1] * 5, 7) * 9; + uint64 t = s[1] << 17; + + s[2] ^= s[0]; + s[3] ^= s[1]; + s[1] ^= s[2]; + s[0] ^= s[3]; + + s[2] ^= t; + s[3] = rol64(s[3], 45); + + return result; +} + +double +rng·random(void) +{ + uint64 r = xoshiro256ss(&rng·RNG); + return (double)r / (double)UINT64_MAX; +} + +uint64 +rng·randi(int max) +{ + uint64 r = xoshiro256ss(&rng·RNG); + return r % max; +} |