Pseudo-Zufallszahlengeneratoren.
> module Random ( randomInts, > random2Ints, random2Doubles > ) > whereA 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)