[scraped and paraphrased from Bob Jenkins's web page at:
 http://burtleburtle.net/bob/rand/isaacafa.html]

ISAAC (Indirection, Shift, Accumulate, Add, and Count) generates 32-bit random
numbers. Averaged out, it requires 18.75 machine cycles to generate each 32-bit
value. Cycles are guaranteed to be at least 240 values long, and they are 28295
values long on average. The results are uniformly distributed, unbiased, and
unpredictable unless you know the seed.

ISAAC-64 generates a different sequence than ISAAC, but it uses the same
principles. It uses 64-bit arithmetic. It generates a 64-bit result every 19
instructions. All cycles are at least 272 values, and the average cycle length
is 216583.  The constants were tuned for a 64-bit machine, and a complement was
thrown in so that all-zero states become nonzero faster. 

The function randinit() must be called before ISAAC-64 can be used, but after
that any module that #includes rand.h can call rand() to get 64-bit random
values.

There are lots of random number generators out there. Why use ISAAC?

* Why not use x=ax+b mod p? Because multiplication and mod are slow. On a Sparc
  it was clocked at being five times slower than ISAAC. Also, ISAAC gives any
  32-bit number, while ax+b mod p gives numbers between 0 and p-1 for some
  prime p. Also, ax+b has easily detected patterns (for example, xi+1 is always
  axi+b mod p).

* Why not use RC4? RC4 is three times slower, more biased, has a shorter
  minimum and average cycle length, and is proprietary. No way is known to
  break either RC4 or ISAAC; both are immune to Gaussian elimination. Use the
  gap test on scaled-down RC4 to see its bias. (RC4 is still very good, much
  much better than x=(ax+b)%p.)

* I've written some tests for random number generators, which can be used to 
  test ISAAC, RC4, ax+b mod p, or any random number generator you feel like
  writing.

* ISAAC should work on any 32-bit platform. (Porting it to a 64-bit machine like
  ALPHA may require masking out overflows in a, randrsl, and mm, or it may just
  need an adjustment of the definition of ub4, or it may work without
  modification. If someone ports it to an ALPHA, send me mail at
  bob_jenkins@burtleburtle.net showing me what you did.) The code in isaac64.c
  has been run on an ALPHA and a x486 with gcc; it produces the same results on
  both.

* I presented a paper, ISAAC, at the 3rd Fast Software Encryption Workshop. An
  online version, somewhat more complete than the published version, is available
  in PDF format as isaac.pdf or Postscript format as isaac.ps (both for A4 paper).
  If you want letter, remove the [a4] from the documentstyle line at the top, then
  do this:

  latex isaac.tex
  dvips -t letter isaac.dvi
  ps2pdf -sPAPERSIZE=letter isaac.ps

* Bias is detectable after 2^37 values for RANDSIZL=3, 2^45 for 4, 2^53 for 5,
  2^61 for 6, 2^69 for 7, and 2^77 values for RANDSIZL=8.
