KiCS-0.8.8: src/lib/Curry/Module/RandomExternal.curry
--- External (more efficient) implementation of random number generation.
---
--- @author sebf@informatik.uni-kiel.de
--- @version January 2008
---
module RandomExternal (
split, nextInt, nextIntRange, nextBoolean,
getRandomSeed
) where
--- Splits a random seed into an infinite list of uncorrelated random seeds.
---
split :: Int -> [Int]
split seed = s1 : split s2
where (s1,s2) = prim_split $## seed
prim_split :: Int -> (Int,Int)
prim_split external
--- Computes an infinite list of random integers.
---
nextInt :: Int -> [Int]
nextInt seed = prim_nextInt $## seed
prim_nextInt :: Int -> [Int]
prim_nextInt external
--- Computes an infinite list of random integers between 0 and given bound.
--- Both 0 and the given bound may occur in the result.
---
nextIntRange :: Int -> Int -> [Int]
nextIntRange seed bound = (prim_nextIntRange $## seed) $## bound
prim_nextIntRange :: Int -> Int -> [Int]
prim_nextIntRange external
--- Computes an infinite list of random booleans.
---
nextBoolean :: Int -> [Bool]
nextBoolean seed = map (0==) (nextIntRange seed 1)
--- Computes an initial random seed.
---
getRandomSeed :: IO Int
getRandomSeed external