Commit | Line | Data |
---|---|---|
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 | |
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 | ||
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 | } |