Pseudo-Zufallszahlengeneratoren.


> module Random         (  randomInts,
>                          random2Ints, random2Doubles
>                       )
> where


A simple random number generator taken from Paulson.


> randomInts            :: Int -> [Int]
> randomInts seed       =  seed:randomInts ((16807 * seed) `mod` 2147483647)


An advanced random number generator taken from the hbc library. Use seeds `s1' in 1..2147483562 and `s2' in 1..2147483398 to generate an infinite list of random Ints.


> random2Ints           :: Int -> Int -> [Int]
> random2Ints s1 s2     =
>     if 1 <= s1 && s1 <= 2147483562 then
>       if 1 <= s2 && s2 <= 2147483398 then
>           rands s1 s2
>       else
>           error "random2Ints: Bad second seed."
>     else
>       error "random2Ints: Bad first seed."



> rands                 :: Int -> Int -> [Int]
> rands s1 s2           =
>     let
>       k    = s1 `div` 53668
>       s1'  = 40014 * (s1 - k * 53668) - k * 12211
>       s1'' = if s1' < 0 then s1' + 2147483563 else s1'
>    
>       k'   = s2 `div` 52774
>       s2'  = 40692 * (s2 - k' * 52774) - k' * 3791
>       s2'' = if s2' < 0 then s2' + 2147483399 else s2'
>
>       z    = s1'' - s2''
>    in  if z < 1 then z + 2147483562 : rands s1'' s2'' 
>                 else z : rands s1'' s2''


Same values for s1 and s2 as above, generates an infinite list of Doubles uniformly distibuted in (0,1).


> random2Doubles        :: Int -> Int -> [Double]
> random2Doubles s1 s2  =
>     map (\x -> fromInt x * 4.6566130638969828e-10) (random2Ints s1 s2)