v2 - Adding a duplicate entry randomly into a list in haskell using random monad
I'd again advise against using monadic computations that produce lazy infinite lists. For most monads (including State) this does not work. For MonadRandom it works only very special cases, when the infinite list is the last randomized computation (if you add another randomized computation after the infinite list, it will diverge).

I can think of two possible solutions:


Find a way to properly formalize this idea of infinite randomized lists and get support from the library authors (or send patches yourself). Since this is for me an interesting problem as well, I started a discussion on this topic.
Use conduits or a similar pipe-like library (such as pipes). This way, you can separate the producer of your values, which can be infinite, and a consumer, that takes only as many values as it needs. The library then "switches" between them: each time a consumer requests input, the producer is asked to provide a new value and is suspended again. In your case this could be used as follows:

import qualified Data.Conduit as C
import qualified Data.Conduit.List as C
import Data.List
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Random

-- ...

-- Produces an infinite source of randomized lists.
duplicateListsSource :: (MonadRandom m) =&gt; [a] -&gt; C.Source m [a]
duplicateListsSource xs =
    forever $ lift (addRandomDuplicate xs) &gt;&gt;= C.yield


main :: IO ()
main = do
    putStrLn $ "list comparison " ++ prettyList list
    g &lt;- getStdGen
    shuffled &lt;- evalRandT (duplicateListsSource list C.$$ C.take 5) g
    putStrLn $ "lists after \n"
               ++ intercalate "\n" (map prettyList shuffled)
  where
    count = 5
    list = ["a","b","c"]