[Haskell-beginners] Random animals

Amy de Buitléir amy at nualeargais.ie
Tue Nov 16 19:13:08 EST 2010

I have this function:

-- | Choose an element at random from a list and return the element and its index
-- Ex: runState (randomListSelection ['a', 'b', 'c', 'd', 'e']) (mkStdGen 1)
randomListSelection :: (RandomGen s) => [a] -> State s (Int, a)
randomListSelection xs = do
  i <- State $ randomR (0,length xs - 1)
  return (i, xs !! i)

I want to repeatedly select random elements from a list. I know the code below is
totally wrong, but it's the closest I've gotten so far. When I run it in ghci, I
get the SAME random element each time, until I reload the module. I guess that's
because g is always the same. I'm still struggling with monads, and would
appreciate any advice on how to fix this.

chooseCreatur = do
  g <- getStdGen
  return (evalState (randomListSelection ["cat", "dog", "lion", "mouse"]) g)

FWIW, I'll be calling it from a loop within the IO monad. The real list will be
growing and shrinking in size.

More information about the Beginners mailing list