<div dir="ltr"><div><a href="https://wiki.haskell.org/Random_shuffle">https://wiki.haskell.org/Random_shuffle</a> says:</div><div><br></div><div>Here's a variation using the MonadRandom package:</div><div><br></div><div>import Control.Monad</div><div>import <a href="http://Control.Monad.ST">Control.Monad.ST</a></div><div>import Control.Monad.Random</div><div>import System.Random</div><div>import <a href="http://Data.Array.ST">Data.Array.ST</a></div><div>import GHC.Arr</div><div> </div><div>shuffle :: RandomGen g => [a] -> Rand g [a]</div><div>shuffle xs = do</div><div>    let l = length xs</div><div>    rands <- take l `fmap` getRandomRs (0, l-1)</div><div>    let ar = runSTArray $ do</div><div>        ar <- thawSTArray $ listArray (0, l-1) xs</div><div>        forM_ (zip [0..(l-1)] rands) $ \(i, j) -> do</div><div>            vi <- readSTArray ar i</div><div>            vj <- readSTArray ar j</div><div>            writeSTArray ar j vi</div><div>            writeSTArray ar i vj</div><div>        return ar</div><div>    return (elems ar)</div><div> </div><div>But this doesn't yield a uniformly-chosen random permutation of its input, because at the i'th step the first `i` elements are not fixed as they are in the other algorithms on that page.</div><div><br></div><div>Cheers,</div><div><br></div><div>David</div></div>