prng: fix rand() to give good sequence with small state
authorSzabolcs Nagy <nsz@port70.net>
Sat, 8 Jun 2013 13:31:10 +0000 (13:31 +0000)
committerSzabolcs Nagy <nsz@port70.net>
Sat, 8 Jun 2013 13:31:10 +0000 (13:31 +0000)
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

src/prng/rand.c

index e3ce634..c000cd2 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include <stdlib.h>
+#include <stdint.h>
 
 
-static unsigned seed;
+static uint64_t seed;
 
 void srand(unsigned s)
 {
 
 void srand(unsigned s)
 {
@@ -9,5 +10,6 @@ void srand(unsigned s)
 
 int rand(void)
 {
 
 int rand(void)
 {
-       return (seed = (seed+1) * 1103515245 + 12345 - 1)+1 & 0x7fffffff;
+       seed = 6364136223846793005ULL*seed + 1;
+       return seed>>33;
 }
 }