4e9d39c6431eb097271b516d795e5ff0ef492dfc
[fio.git] / t / gen-rand.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <inttypes.h>
4 #include <assert.h>
5 #include <math.h>
6 #include <string.h>
7
8 #include "../lib/types.h"
9 #include "../log.h"
10 #include "../lib/lfsr.h"
11 #include "../lib/axmap.h"
12 #include "../smalloc.h"
13 #include "../minmax.h"
14 #include "../lib/rand.h"
15
16 int main(int argc, char *argv[])
17 {
18         struct frand_state s;
19         uint64_t i, start, end, nvalues;
20         unsigned long *buckets, index, pass, fail;
21         double p, dev, mean, vmin, vmax;
22
23         if (argc < 4) {
24                 log_err("%s: start end nvalues\n", argv[0]);
25                 return 1;
26         }
27
28         start = strtoul(argv[1], NULL, 10);
29         end = strtoul(argv[2], NULL, 10);
30
31         if (start >= end) {
32                 log_err("%s: start must be smaller than end\n", argv[0]);
33                 return 1;
34         }
35         index = 1 + end - start;
36         buckets = calloc(index, sizeof(unsigned long));
37
38         nvalues = strtoul(argv[3], NULL, 10);
39
40         init_rand(&s, false);
41
42         for (i = 0; i < nvalues; i++) {
43                 int v = rand32_between(&s, start, end);
44
45                 buckets[v - start]++;
46         }
47
48         p = 1.0 / index;
49         dev = sqrt(nvalues * p * (1.0 - p));
50         mean = nvalues * p;
51         vmin = mean - dev;
52         vmax = mean + dev;
53
54         pass = fail = 0;
55         for (i = 0; i < index; i++) {
56                 if (buckets[i] < vmin || buckets[i] > vmax) {
57                         printf("FAIL bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax);
58                         fail++;
59                 } else {
60                         printf("PASS bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax);
61                         pass++;
62                 }
63         }
64
65         printf("Passes=%lu, Fail=%lu\n", pass, fail);
66         free(buckets);
67         return 0;
68 }