add test for strftime
[libc-test.git] / src / functional / random.c
blob69596fb36caabdb2324bb98474ea00633b0cf151
1 #define _XOPEN_SOURCE 700
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "test.h"
6 /* naive statistical checks */
8 /* error p ~ 1.6e-6 */
9 static int chkmissing(long *x)
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;
21 /* error p ~ 4e-6 */
22 static int chkrepeat(long *x)
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;
32 /* error p ~ 1e-6 */
33 static unsigned orx;
34 static int chkones(long *x)
36 int i;
37 orx = 0;
38 for (i = 0; i < 20; i++)
39 orx |= x[i];
40 return orx != 0x7fffffff;
43 void checkseed(unsigned seed, long *x)
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);
57 int main()
59 long x[100];
60 long y,z;
61 int i;
62 char state[128];
63 char *p;
64 char *q;
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);
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;