Notes about distribution tables from Nistnet
-------------------------------------------------------------------------------
I. About the distribution tables

The table used for "synthesizing" the distribution is essentially a scaled,
translated, inverse to the cumulative distribution function.

Here's how to think about it: Let F() be the cumulative distribution
function for a probability distribution X.  We'll assume we've scaled
things so that X has mean 0 and standard deviation 1, though that's not
so important here.  Then:

	F(x) = P(X <= x) = \int_{-inf}^x f

where f is the probability density function.

F is monotonically increasing, so has an inverse function G, with range
0 to 1.  Here, G(t) = the x such that P(X <= x) = t.  (In general, G may
have singularities if X has point masses, i.e., points x such that
P(X = x) > 0.)

Now we create a tabular representation of G as follows:  Choose some table
size N, and for the ith entry, put in G(i/N).  Let's call this table T.

The claim now is, I can create a (discrete) random variable Y whose
distribution has the same approximate "shape" as X, simply by letting
Y = T(U), where U is a discrete uniform random variable with range 1 to N.
To see this, it's enough to show that Y's cumulative distribution function,
(let's call it H), is a discrete approximation to F.  But

	H(x) = P(Y <= x)
	     = (# of entries in T <= x) / N   -- as Y chosen uniformly from T
	     = i/N, where i is the largest integer such that G(i/N) <= x
	     = i/N, where i is the largest integer such that i/N <= F(x)
	     		-- since G and F are inverse functions (and F is
	     		   increasing)
	     = floor(N*F(x))/N

as desired.

II. How to create distribution tables (in theory)

How can we create this table in practice? In some cases, F may have a
simple expression which allows evaluating its inverse directly.  The
pareto distribution is one example of this.  In other cases, and
especially for matching an experimentally observed distribution, it's
easiest simply to create a table for F and "invert" it.  Here, we give
a concrete example, namely how the new "experimental" distribution was
created.

1. Collect enough data points to characterize the distribution.  Here, I
collected 25,000 "ping" roundtrip times to a "distant" point (time.nist.gov).
That's far more data than is really necessary, but it was fairly painless to
collect it, so...

2. Normalize the data so that it has mean 0 and standard deviation 1.

3. Determine the cumulative distribution.  The code I wrote creates a table
covering the range -10 to +10, with granularity .00005.  Obviously, this
is absurdly over-precise, but since it's a one-time only computation, I
figured it hardly mattered.

4. Invert the table: for each table entry F(x) = y, make the y*TABLESIZE
(here, 4096) entry be x*TABLEFACTOR (here, 8192).  This creates a table
for the ("normalized") inverse of size TABLESIZE, covering its domain 0
to 1 with granularity 1/TABLESIZE.  Note that even with the granularity
used in creating the table for F, it's possible not all the entries in
the table for G will be filled in.  So, make a pass through the
inverse's table, filling in any missing entries by linear interpolation.

III. How to create distribution tables (in practice)

If you want to do all this yourself, I've provided several tools to help:

1. maketable does the steps 2-4 above, and then generates the appropriate
header file.  So if you have your own time distribution, you can generate
the header simply by:

	maketable < time.values > header.h

2. As explained in the other README file, the somewhat sleazy way I have
of generating correlated values needs correction.  You can generate your
own correction tables by compiling makesigtable and makemutable with
your header file.  Check the Makefile to see how this is done.

3. Warning: maketable, makesigtable and especially makemutable do
enormous amounts of floating point arithmetic.  Don't try running
these on an old 486.  (NIST Net itself will run fine on such a
system, since in operation, it just needs to do a few simple integral
calculations.  But getting there takes some work.)

4. The tables produced are all normalized for mean 0 and standard
deviation 1.  How do you know what values to use for real?  Here, I've
provided a simple "stats" utility.  Give it a series of floating point
values, and it will return their mean (mu), standard deviation (sigma),
and correlation coefficient (rho).  You can then plug these values
directly into NIST Net.
