[Haskell-cafe] Bug in random shuffle algorithm

David Turner dct25-561bs at mythic-beasts.com
Mon May 8 16:02:52 UTC 2017


https://wiki.haskell.org/Random_shuffle says:

Here's a variation using the MonadRandom package:

import Control.Monad
import Control.Monad.ST
import Control.Monad.Random
import System.Random
import Data.Array.ST
import GHC.Arr

shuffle :: RandomGen g => [a] -> Rand g [a]
shuffle xs = do
    let l = length xs
    rands <- take l `fmap` getRandomRs (0, l-1)
    let ar = runSTArray $ do
        ar <- thawSTArray $ listArray (0, l-1) xs
        forM_ (zip [0..(l-1)] rands) $ \(i, j) -> do
            vi <- readSTArray ar i
            vj <- readSTArray ar j
            writeSTArray ar j vi
            writeSTArray ar i vj
        return ar
    return (elems ar)

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.

Cheers,

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20170508/27d4da9d/attachment.html>


More information about the Haskell-Cafe mailing list