cleanup
[rpikern] / src / libc / rand.c
1 /* random number generator, based on this description of the algorithm
2  * used by the GNU libc: https://www.mathstat.dal.ca/~selinger/random
3  */
4 #include <stdlib.h>
5 #include <inttypes.h>
6
7 static int init_done;
8 static int32_t rng[34];
9 static int32_t *ptr0, *ptr1;
10
11 int rand(void)
12 {
13         int res;
14
15         if(!init_done) {
16                 srand(1);
17         }
18
19         *ptr1 += *ptr0;
20         res = (uint32_t)*ptr1 >> 1;
21         if(++ptr0 >= rng + 34) ptr0 = rng;
22         if(++ptr1 >= rng + 34) ptr1 = rng;
23
24         return res;
25 }
26
27 void srand(unsigned int seed)
28 {
29         int i;
30
31         init_done = 1;
32         if(seed == 0) seed = 1;
33
34         rng[0] = seed;
35         for(i=1; i<31; i++) {
36                 rng[i] = (16807 * rng[i - 1]) % RAND_MAX;
37                 if(rng[i] < 0) rng[i] += RAND_MAX;
38         }
39         for(i=31; i<34; i++) {
40                 rng[i] = rng[i - 31];
41         }
42         ptr0 = rng + 3;
43         ptr1 = rng + 31;
44
45         for(i=34; i<344; i++) {
46                 rand();
47         }
48 }