add _DEFAULT_SOURCE wherever _BSD_SOURCE was used
[libc-test] / src / functional / random.c
1 #define _XOPEN_SOURCE 700
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "test.h"
5
6 /* naive statistical checks */
7
8 /* error p ~ 1.6e-6 */
9 static int chkmissing(long *x)
10 {
11         int d[8] = {0};
12         int i;
13         for (i = 0; i < 100; i++)
14                 d[x[i]%8]++;
15         for (i = 0; i < 8; i++)
16                 if (d[i]==0)
17                         return 1;
18         return 0;
19 }
20
21 /* error p ~ 4e-6 */
22 static int chkrepeat(long *x)
23 {
24         int i, j;
25         for (i = 0; i < 100; i++)
26                 for (j = 0; j < i; j++)
27                         if (x[i] == x[j])
28                                 return 1;
29         return 0;
30 }
31
32 /* error p ~ 1e-6 */
33 static unsigned orx;
34 static int chkones(long *x)
35 {
36         int i;
37         orx = 0;
38         for (i = 0; i < 20; i++)
39                 orx |= x[i];
40         return orx != 0x7fffffff;
41 }
42
43 void checkseed(unsigned seed, long *x)
44 {
45         int i;
46         srandom(seed);
47         for (i = 0; i < 100; i++)
48                 x[i] = random();
49         if (chkmissing(x))
50                 t_error("weak seed %d, missing pattern in low bits\n", seed);
51         if (chkrepeat(x))
52                 t_error("weak seed %d, exact repeats\n", seed);
53         if (chkones(x))
54                 t_error("weak seed %d, or pattern: 0x%08x\n", seed, orx);
55 }
56
57 int main()
58 {
59         long x[100];
60         long y,z;
61         int i;
62         char state[128];
63         char *p;
64         char *q;
65
66         for (i = 0; i < 100; i++)
67                 x[i] = random();
68         p = initstate(1, state, sizeof state);
69         for (i = 0; i < 100; i++)
70                 if (x[i] != (y = random()))
71                         t_error("initstate(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y);
72         for (i = 0; i < 10; i++) {
73                 z = random();
74                 q = setstate(p);
75                 if (z != (y = random()))
76                         t_error("setstate failed (%d) orig: %ld, reset: %ld\n", i, z, y);
77                 p = setstate(q);
78         }
79         srandom(1);
80         for (i = 0; i < 100; i++)
81                 if (x[i] != (y = random()))
82                         t_error("srandom(1) is not default: (%d) default: %ld, seed1: %ld\n", i, x[i], y);
83         checkseed(0x7fffffff, x);
84         for (i = 0; i < 10; i++)
85                 checkseed(i, x);
86         return t_status;
87 }