From c79cd27e9e81eb5e223728094f1233ee2fc12dda Mon Sep 17 00:00:00 2001 From: Szabolcs Nagy Date: Sat, 8 Jun 2013 13:31:10 +0000 Subject: 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 --- src/prng/rand.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/prng/rand.c') diff --git a/src/prng/rand.c b/src/prng/rand.c index e3ce6347..c000cd24 100644 --- a/src/prng/rand.c +++ b/src/prng/rand.c @@ -1,6 +1,7 @@ #include +#include -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; } -- cgit v1.2.1