1
1
/*
2
2
* Pseudorandom number generator
3
3
*
4
- * Author: Philip Levis <[email protected] >
5
4
* Author: Pat Hanrahan <[email protected] >
5
+ * Author: Julie Zelenski <[email protected] >
6
6
*/
7
7
8
8
#include "rand.h"
9
+ #include <stdbool.h>
10
+ #include <stdint.h>
9
11
10
- // From http://stackoverflow.com/questions/1167253/implementation-of-rand
11
- unsigned int rand (void ) {
12
- static unsigned int z1 = 12345 , z2 = 12345 , z3 = 12345 , z4 = 12345 ;
13
- unsigned int b ;
12
+ static struct {
13
+ bool initialized ;
14
+ uint32_t z1 , z2 , z3 , z4 ;
15
+ } module = {
16
+ .initialized = false,
17
+ };
14
18
15
- b = ((z1 << 6 ) ^ z1 ) >> 13 ;
16
- z1 = ((z1 & 4294967294U ) << 18 ) ^ b ;
17
- b = ((z2 << 2 ) ^ z2 ) >> 27 ;
18
- z2 = ((z2 & 4294967288U ) << 2 ) ^ b ;
19
- b = ((z3 << 13 ) ^ z3 ) >> 21 ;
20
- z3 = ((z3 & 4294967280U ) << 7 ) ^ b ;
21
- b = ((z4 << 3 ) ^ z4 ) >> 12 ;
22
- z4 = ((z4 & 4294967168U ) << 13 ) ^ b ;
23
- return (z1 ^ z2 ^ z3 ^ z4 );
19
+ unsigned int rand (void ) {
20
+ if (!module .initialized ) {
21
+ srand (12345 );
22
+ }
23
+ // http://stackoverflow.com/questions/1167253/implementation-of-rand
24
+ // LFSR113 from L'écuyer
25
+ uint32_t b ;
26
+ b = ((module .z1 << 6 ) ^ module .z1 ) >> 13 ;
27
+ module .z1 = ((module .z1 & 4294967294U ) << 18 ) ^ b ;
28
+ b = ((module .z2 << 2 ) ^ module .z2 ) >> 27 ;
29
+ module .z2 = ((module .z2 & 4294967288U ) << 2 ) ^ b ;
30
+ b = ((module .z3 << 13 ) ^ module .z3 ) >> 21 ;
31
+ module .z3 = ((module .z3 & 4294967280U ) << 7 ) ^ b ;
32
+ b = ((module .z4 << 3 ) ^ module .z4 ) >> 12 ;
33
+ module .z4 = ((module .z4 & 4294967168U ) << 13 ) ^ b ;
34
+ return (module .z1 ^ module .z2 ^ module .z3 ^ module .z4 );
24
35
}
36
+
37
+ void srand (unsigned int seed ) {
38
+ // initial factors must be >= 2, 8, 16, and 128 respectively
39
+ // this just lifts all to at least 128 to satisfy requirement
40
+ seed <<= 1 ;
41
+ if (seed < 128 ) seed += 128 ;
42
+ module .z1 = seed ;
43
+ module .z2 = seed ;
44
+ module .z3 = seed ;
45
+ module .z4 = seed ;
46
+ module .initialized = true;
47
+ }
0 commit comments