Commit | Line | Data |
---|---|---|
323f2086 JA |
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 | ||
ea4cc0ea | 40 | init_rand(&s, false); |
323f2086 JA |
41 | |
42 | for (i = 0; i < nvalues; i++) { | |
36dd3379 | 43 | int v = rand32_between(&s, start, end); |
323f2086 JA |
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) { | |
9d0ad2a5 | 57 | printf("FAIL bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax); |
323f2086 JA |
58 | fail++; |
59 | } else { | |
9d0ad2a5 | 60 | printf("PASS bucket%4lu: val=%8lu (%.1f < %.1f > %.1f)\n", (unsigned long) i + 1, buckets[i], vmin, mean, vmax); |
323f2086 JA |
61 | pass++; |
62 | } | |
63 | } | |
64 | ||
65 | printf("Passes=%lu, Fail=%lu\n", pass, fail); | |
66 | ||
67 | return 0; | |
68 | } |