Use 16 bit galois field based PRNG.
authorPat Thoyts <patthoyts@users.sourceforge.net>
Tue, 16 Dec 2014 13:04:13 +0000 (13:04 +0000)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Tue, 16 Dec 2014 13:04:13 +0000 (13:04 +0000)
This has much better distribution in the low bits over its period.

main.c

diff --git a/main.c b/main.c
index 34c5e8ea6e5911221ed9cf4d78a91c68257fb8e2..0ab0b8de18ae3ac56058f9e9a5d308549db6d5df 100644 (file)
--- a/main.c
+++ b/main.c
 #define CLKP BIT6 /* P1.6 */
 #define CLKN BIT7 /* P1.7 */
 
-static unsigned long next = 0;
-static void my_srand(unsigned long seed)
+static uint16_t prng_state = 0xACE1u;
+static void my_srand(uint16_t seed)
 {
-    next = seed;
+    prng_state = seed;
 }
-static unsigned int
+static uint16_t
 my_rand()
 {
-    next = next * 1103515245 + 12345;
-    return (unsigned int)next;
+    unsigned lsb = prng_state & 1;
+    prng_state >>= 1;
+    if (lsb == 1)
+        prng_state ^= 0xB400u;
+    return prng_state;
 }
 
 static void
@@ -53,11 +56,10 @@ main(void)
     WDTCTL = WDTPW + WDTHOLD;
 
     /* external 32.768kHz crystal */
-    BCSCTL1 |= DIVA_3; /* ACLK/8 */
+    BCSCTL1 |= DIVA_3; /* ACLK/8: 4096 clock interrupts per second */
     BCSCTL3 |= XCAP_3; /* enable 12.5pF internal capacitance */
 
-    srand(2);
-    my_srand(0xdeadbeef);
+    my_srand(0xACE1u); /* FIX ME: get a physically derived seed */
     setup();
 
     /* enable global interrupts */