Kirk Haines wrote:
> This is to announce the release of Crypt::ISAAC, a pure Ruby implementation 
> of the ISAAC psuedo-random number generator.  ISAAC is an algorithm for 
> generating cryptographically secure psuedo-random numbers.  This library has 
> been part of the Iowa package for a couple of years.  This version will 
> become the canonical version, however.
> 
> Crypt::ISAAC can be used to setup multiple independent streams of random 
> numbers, and offers a simple interface identical to that of Kernel.rand():
> 
> 
> require 'crypt/isaac'
> 
> rng1 = Crypt::ISAAC.new
> rng2 = Crypt::ISAAC.new
> 
> ri1 = rng1.rand(1000000)
> ri2 = rng2.rand(1000000)
> rf1 = rng1.rand
> rf2 = rng2-rand
> 
> puts "#{ri1} -- #{ri2}"
> puts "#{rf1} -- #{rf2}"
> 
> 
> I am releasing the library as version 0.9 just because while I have been 
> using it for a couple of years, nobody else has ever looked at it, so there 
> may well be some tweaks and nudges to bits of it before I call it 1.0.

Thanks for that, Kirk. But I think I will need repeatability (as with 
Kernel#srand), for use in simulations, and also speed. So I kludged up a 
extension at http://redshift.sourceforge.net/isaac. It's public domain, 
just like the original ISAAC.

One difference: since I am interested in simulations, I followed 
Jenkins' advice and set the state vector length to 16 longs rather than 
256 (smaller, faster, less secure). In the next iteration, I will make 
this selectable from the API.

It's not well tested, but usage is:


[ruby/prj/isaac/ext/isaac] irb -r isaac.so
irb(main):001:0> r = ISAAC.new
=> #<ISAAC:0x40208aa0>
irb(main):002:0> r.srand [234,546,7868,98]
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
irb(main):003:0> r.rand32
=> 413434623
irb(main):004:0> r.rand32
=> 1012446849
irb(main):005:0> r.rand32
=> 3846288904

The input (and output) of #srand is an array of up to 16 longs used to 
seed the generator.

Also in the next version: float output, distributions as in the Rand.rb 
that someone pointed out, better namespace, etc.