On Wed, Nov 10, 2010 at 11:33 AM, Lauri Alanko <la@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