diff options
author | Szabolcs Nagy <nsz@port70.net> | 2013-06-08 13:31:10 +0000 |
---|---|---|
committer | Szabolcs Nagy <nsz@port70.net> | 2013-06-08 13:31:10 +0000 |
commit | c79cd27e9e81eb5e223728094f1233ee2fc12dda (patch) | |
tree | c210ea1472b25519a62fd33e04e5809a16e76cbc /src/prng | |
parent | fd1d7be35f1b7f083071e246208498aa3b5ced3e (diff) | |
download | musl-c79cd27e9e81eb5e223728094f1233ee2fc12dda.zip musl-c79cd27e9e81eb5e223728094f1233ee2fc12dda.tar.gz musl-c79cd27e9e81eb5e223728094f1233ee2fc12dda.tar.bz2 |
prng: fix rand() to give good sequence with small state
some applications rely on the low bits of rand() to be reasonably good
quality prng, so now it fixed by using the top bits of a 64 bit LCG,
this is simple, has small state and passes statistical tests.
D.E. Knuth attributes the multiplier to C.E. Haynes in TAOCP Vol2 3.3.4
Diffstat (limited to 'src/prng')
-rw-r--r-- | src/prng/rand.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/prng/rand.c b/src/prng/rand.c index e3ce634..c000cd2 100644 --- a/src/prng/rand.c +++ b/src/prng/rand.c @@ -1,6 +1,7 @@ #include <stdlib.h> +#include <stdint.h> -static unsigned seed; +static uint64_t seed; void srand(unsigned s) { @@ -9,5 +10,6 @@ void srand(unsigned s) int rand(void) { - return (seed = (seed+1) * 1103515245 + 12345 - 1)+1 & 0x7fffffff; + seed = 6364136223846793005ULL*seed + 1; + return seed>>33; } |