blob: 445229062ab77276f2e17a424f74b72c8d716f58 [file] [log] [blame]
tanjent@gmail.comf3b78972012-03-01 03:38:55 +00001#include "Stats.h"
2
3//-----------------------------------------------------------------------------
4
5double chooseK ( int n, int k )
6{
7 if(k > (n - k)) k = n - k;
8
9 double c = 1;
10
11 for(int i = 0; i < k; i++)
12 {
13 double t = double(n-i) / double(i+1);
14
15 c *= t;
16 }
17
18 return c;
19}
20
21double chooseUpToK ( int n, int k )
22{
23 double c = 0;
24
25 for(int i = 1; i <= k; i++)
26 {
27 c += chooseK(n,i);
28 }
29
30 return c;
31}
32
33//-----------------------------------------------------------------------------
34// Distribution "score"
35// TODO - big writeup of what this score means
36
37// Basically, we're computing a constant that says "The test distribution is as
38// uniform, RMS-wise, as a random distribution restricted to (1-X)*100 percent of
39// the bins. This makes for a nice uniform way to rate a distribution that isn't
40// dependent on the number of bins or the number of keys
41
42// (as long as # keys > # bins * 3 or so, otherwise random fluctuations show up
43// as distribution weaknesses)
44
45double calcScore ( const int * bins, const int bincount, const int keycount )
46{
47 double n = bincount;
48 double k = keycount;
49
50 // compute rms value
51
52 double r = 0;
53
54 for(int i = 0; i < bincount; i++)
55 {
56 double b = bins[i];
57
58 r += b*b;
59 }
60
61 r = sqrt(r / n);
62
63 // compute fill factor
64
65 double f = (k*k - 1) / (n*r*r - k);
66
67 // rescale to (0,1) with 0 = good, 1 = bad
68
69 return 1 - (f / n);
70}
71
72
73//----------------------------------------------------------------------------
74
75void plot ( double n )
76{
77 double n2 = n * 1;
78
79 if(n2 < 0) n2 = 0;
80
81 n2 *= 100;
82
83 if(n2 > 64) n2 = 64;
84
85 int n3 = (int)n2;
86
87 if(n3 == 0)
88 printf(".");
89 else
90 {
91 char x = '0' + char(n3);
92
93 if(x > '9') x = 'X';
94
95 printf("%c",x);
96 }
97}
98
99//-----------------------------------------------------------------------------