hpaste

recent | annotate | new

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,max-1) 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 ls-1) 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,max-1) 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