1 #include "Stats.h"
2 
3 //-----------------------------------------------------------------------------
4 
chooseK(int n,int k)5 double 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 
chooseUpToK(int n,int k)21 double 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 
calcScore(const int * bins,const int bincount,const int keycount)45 double 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 
plot(double n)75 void 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 //-----------------------------------------------------------------------------
100