浏览代码

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
Szabolcs Nagy 11 年之前
父节点
当前提交
c79cd27e9e
共有 1 个文件被更改,包括 4 次插入2 次删除
  1. 4 2
      src/prng/rand.c

+ 4 - 2
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;
 }