newbie:: getting random Ints

Peter Rooney
02 Apr 2002 23:00:09 -0500 (Ketil Z. Malde) writes:

<snip OP>
> Depending on why you need random numbers, you might want to consider
> using a fixed seed, i.e. 
>         a = randoms (mkStdGen 4711)
> will get you a sequence of "random" numbers.  Of course, it will be
> the same sequence for every run of your program, but in some cases,
> (when you only want arbitrary data, and not necessarily random) this
> won't matter much.
> The advantage is, of course, that you get rid of the IO monad.  I've
> toyed with the idea of using unsafePerformIO (at least to get the
> seed), but haven't quite dared (or needed) to yet. :-)

well, thanks to all for the help. in my case, it was not OK to have
arbitrary data, i needed (pseudo-) random numbers for different runs
of the program.  i want to:

-generate random Ints
-do some arbitrary computations on them to generate a [[Int]]
-compare each [Int] in the list with a list of [Int] known at compile time

the functions below seem to be doing what i need; i'm posting the code
in case it helps other newbies get there a bit faster than i did. any
constructive criticism / pointing out of errors most welcome.


> import Random

> rollDice :: IO Int
> rollDice = getStdRandom (randomR (1,6))
> getRandomSeed :: IO Int
> getRandomSeed = do
>                 retval <- rollDice
>                 return retval
> getRandomSeedInt :: IO Int -> Int
> getRandomSeedInt x = unsafePerformIO x
> getARange :: Int -> Int -> [Int]
> getARange x y  = randomRs (x,y) (mkStdGen (getRandomSeedInt getRandomSeed))
> getRandomInt :: Int -> Int
> getRandomInt x = head (take 1 (getARange 0 x ))


Main> take 20 (getARange 0 10)
Main> take 20 (getARange 0 10)

thanks and regards,