
On Friday 26 November 2010 08:20:38, Jan Snajder wrote:
Hi,
I'd like to evaluate a random computation using Control.Monad.Random, but I'd like to be able to fix the seed value. I know I can use mkStdGen from System.Random to get an initial generator. I also know I can use
evalRand :: RandomGen g => Rand g a -> g -> a
from Control.Monad.Random to evaluate a random computation. But the problem is I don't see how I can turn a StdGen value that I get from mkStdGen into a Rand type.
What would you need that for? Rand is basically the State monad (newtype wrapped), which is basically s -> (a,s) (newtype wrapped). You can write your computation so that it works with whatever pseudo-random generator it is given and then let g be determined by the value passed to evalRand. That is the default use case. For example die :: (RandomGen g) => Rand g Int die = getRandomR (1,6) dice :: (RandomGen g) => Int -> Rand g [Int] dice n = sequence (replicate n die) main :: IO () main = do print $ evalRand (dice 10) (mkStdGen 123) print $ evalRand (dice 10) (mkBlumBlumShub 2379009 1234567890983) (for a hypothetical data BlumBlumShub = BBS !Integer !Integer instance RandomGen BlumBlumShub where ... mkBlumBlumShub :: Integer -> Integer -> BlumBlumShub )
What am I missing here?
Best, Jan