import Data.Array.MArray
import Random
import Control.Monad (unless)
import Data.Array.IO (IOArray)
listShuffle ls = do
arr <- newListArray (0,length ls) ls
rng <- newStdGen
shuffle arr rng
getElems arr
shuffle arr gen = do
(min,max) <- getBounds arr
knuthShuffle' arr (min,max) gen
knuthShuffle' arr (min,max) gen = do
if (max min == 0)
then return ()
else do
let (k,ngen) = randomR (min,max) gen
unless (k == max) (swap k max arr)
knuthShuffle' arr (min,max1) ngen
swap m n arr = do
m' <- readArray arr m
n' <- readArray arr n
writeArray arr n m'
writeArray arr m n'
main :: IO ()
main = do
ls <- listShuffle [0..100]
putStrLn $ show ls
import Data.Array.MArray
import Random
import Control.Monad (unless)
import Data.Array.IO (IOArray)
listShuffle ls = do
arr <- newListArray (0,length ls1) ls
rng <- newStdGen
shuffle arr rng
getElems arr
shuffle :: (MArray IOArray a IO, RandomGen n) => IOArray Int a -> n -> IO ()
shuffle arr gen = do
(min,max) <- getBounds arr
knuthShuffle' arr (min,max) gen
knuthShuffle' arr (min,max) gen = do
if (max min == 0)
then return ()
else do
let (k,ngen) = randomR (min,max) gen
unless (k == max) (swap k max arr)
knuthShuffle' arr (min,max1) ngen
swap m n arr = do
m' <- readArray arr m
n' <- readArray arr n
writeArray arr n m'
writeArray arr m n'
main :: IO ()
main = do
ls <- listShuffle [0..100]
putStrLn $ show ls