random(3) implementation
[musl-tables] / prng / t.c
1 #include <stdio.h>
2
3 void srandom(unsigned seed);
4 char *initstate(unsigned seed, char *state, size_t size);
5 char *setstate(char *state);
6 long random(void);
7
8 int chk(long *x) {
9         int d[10] = {0};
10         int i;
11
12         for (i = 0; i < 100; i++)
13                 d[x[i]%10]++;
14         for (i = 0; i < 10; i++)
15                 if (d[i] < 2)
16                         return 1;
17         return 0;
18 }
19
20 int main() {
21         long x[100];
22         long y,z;
23         int i,j;
24         char state[128];
25         char *p;
26         char *q;
27
28         for (i = 0; i < 100; i++)
29                 x[i] = random();
30         if (chk(x))
31                 printf("fail rand\n");
32         p = initstate(1, state, sizeof state);
33         for (i = 0; i < 100; i++)
34                 if (x[i] != (y = random()))
35                         printf("fail init %d %ld %ld\n", i, x[i], y);
36         for (i = 0; i < 100; i++) {
37                 z = random();
38                 q = setstate(p);
39                 if (z != (y = random()))
40                         printf("fail set %d %ld %ld\n", i, z, y);
41                 p = setstate(q);
42         }
43         srandom(1);
44         for (i = 0; i < 100; i++)
45                 if (x[i] != (y = random()))
46                         printf("fail srand1 %d %ld %ld\n", i, x[i], y);
47         for (j = 0; j < 1000; j++) {
48                 srandom(j);
49                 for (i = 0; i < 100; i++) {
50                         y = random();
51                         if (x[i] == y)
52                                 printf("fail srand %d %d %ld %ld\n", j, i, x[i], y);
53                         x[i] = y;
54                 }
55                 if (chk(x))
56                         printf("weak seed %d\n", j);
57         }
58         return 0;
59 }