Merge branch 'no-unittest-dep' of https://github.com/parallel-fs-utils/fio
[fio.git] / t / gen-rand.c
CommitLineData
3d2d14bc
SW
1#include <math.h>
2#include <stdint.h>
323f2086
JA
3#include <stdio.h>
4#include <stdlib.h>
323f2086
JA
5
6#include "../lib/types.h"
323f2086 7#include "../lib/rand.h"
3d2d14bc 8#include "../log.h"
323f2086
JA
9
10int 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
ea4cc0ea 34 init_rand(&s, false);
323f2086
JA
35
36 for (i = 0; i < nvalues; i++) {
1bd5d213 37 int v = rand_between(&s, start, end);
323f2086
JA
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) {
9d0ad2a5 51 printf("FAIL bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax);
323f2086
JA
52 fail++;
53 } else {
9d0ad2a5 54 printf("PASS bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax);
323f2086
JA
55 pass++;
56 }
57 }
58
59 printf("Passes=%lu, Fail=%lu\n", pass, fail);
5e7bb921 60 free(buckets);
323f2086
JA
61 return 0;
62}