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