diff options
Diffstat (limited to 'sys/base/rng/base.c')
-rw-r--r-- | sys/base/rng/base.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/sys/base/rng/base.c b/sys/base/rng/base.c new file mode 100644 index 0000000..9ec496e --- /dev/null +++ b/sys/base/rng/base.c @@ -0,0 +1,24 @@ +#include "internal.h" + +static uint64 +splitmix64(struct Mix *state) +{ + uint64 result = state->s; + + state->s = result + 0x9E3779B97f4A7C15; + result = (result ^ (result >> 30)) * 0xBF58476D1CE4E5B9; + result = (result ^ (result >> 27)) * 0x94D049BB133111EB; + return result ^ (result >> 31); +} + +int +rng·init(uint64 seed) +{ + int i; + Mix smstate = {seed}; + + for(i=0; i < 4; i++) + rng·RNG.s[i] = splitmix64(&smstate); + + return 0; +} |