[Haskell-cafe] Splittable random numbers

Ryan Newton rrnewton at gmail.com
Sat Jan 22 06:40:04 CET 2011


On Wed, Nov 10, 2010 at 11:33 AM, Lauri Alanko <la at iki.fi> wrote:
> So a naive implementation of split would be:
>
> split g = (mkGen seed, g')
>  where (seed, g') = random g

Just to be clear, that is the same as Burton Smith's original proposal that
Simon mentioned at the outset, right?  Specifically, Smith's proposal is
yours instantiated with a crypto based PRNG?

So, except for the silliness of generating 128 random bits to make an Int,
the following would implement the strategy using the "crypto" package on
Hackage, correct?
--------------------------------------------------
import Codec.Encryption.AES
import Data.LargeWord
import System.Random

data RNG = RNG Word128 Word128 deriving Show
next128 (RNG k c) = (encrypt k c, RNG k (c+1))

instance RandomGen RNG where
  next g = (fromIntegral n, g')
   where (n,g') = next128 g
  split g@(RNG k c) = (g', RNG n 0)
   where (n,g') = next128 g
--------------------------------------------------

The reason I brought up AES-NI was that doing AES in hardware would allow
about an 8X improvement over the best software implementation (~2 cycles per
byte encrypted).  Comparison would be warranted, but perhaps it could make
the crypto based PRNG efficient enough for day-to-day use.

Best,
 -Ryan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110122/547e164a/attachment.htm>


More information about the Haskell-Cafe mailing list