Commit patch to not break on spaces.
[bowtie.git] / random_source.h
1 #ifndef RANDOM_GEN_H_
2 #define RANDOM_GEN_H_
3
4 #include "assert_helpers.h"
5
6 /**
7  * Simple pseudo-random linear congruential generator, a la Numerical
8  * Recipes.
9  */
10 class RandomSource {
11 public:
12         static const uint32_t DEFUALT_A = 1664525;
13         static const uint32_t DEFUALT_C = 1013904223;
14
15         RandomSource() :
16                 a(DEFUALT_A), c(DEFUALT_C), inited_(false) { }
17         RandomSource(uint32_t _a, uint32_t _c) :
18                 a(_a), c(_c), inited_(false) { }
19
20         void init(uint32_t seed = 0) {
21                 last = seed;
22                 inited_ = true;
23         }
24
25         uint32_t nextU32() {
26                 assert(inited_);
27                 uint32_t ret;
28                 last = a * last + c;
29                 ret = last >> 16;
30                 last = a * last + c;
31                 ret ^= last;
32                 lastOff = 0;
33                 return ret;
34         }
35
36         uint32_t nextU2() {
37                 assert(inited_);
38                 if(lastOff > 30) {
39                         nextU32();
40                 }
41                 uint32_t ret = (last >> lastOff) & 3;
42                 lastOff += 2;
43                 return ret;
44         }
45
46         static uint32_t nextU32(uint32_t last,
47                                 uint32_t a = DEFUALT_A,
48                                 uint32_t c = DEFUALT_C)
49         {
50                 return (a * last) + c;
51         }
52
53 private:
54         uint32_t a;
55         uint32_t c;
56         uint32_t last;
57         uint32_t lastOff;
58         bool inited_;
59 };
60
61 #endif /*RANDOM_GEN_H_*/