Difference between revisions of "99 questions/Solutions/25"

From HaskellWiki
Jump to navigation Jump to search
(Added an alternative solution)
(add a warning for one solution)
Line 42: Line 42:
 
rndPermutation xs = rndElem . permutations $ xs
 
rndPermutation xs = rndElem . permutations $ xs
 
</haskell>
 
</haskell>
  +
  +
WARNING: this may choke long lists

Revision as of 05:11, 12 January 2012

Generate a random permutation of the elements of a list.

rnd_permu xs = diff_select' (length xs) xs

Uses the solution for the previous problem. Choosing N distinct elements from a list of length N will yield a permutation.

Or we can generate the permutation recursively:

import System.Random (randomRIO)

rnd_permu :: [a] -> IO [a]
rnd_permu []     = return []
rnd_permu (x:xs) = do
    rand <- randomRIO (0, (length xs))
    rest <- rnd_permu xs
    return $ let (ys,zs) = splitAt rand rest
             in ys++(x:zs)

rnd_permu' [] = return []
rnd_permu' xs = do
    rand <- randomRIO (0, (length xs)-1)
    rest <- let (ys,(_:zs)) = splitAt rand xs
            in rnd_permu' $ ys ++ zs
    return $ (xs!!rand):rest

Or we can use the permutations function from Data.List:

import System.Random (getStdGen, randomRIO)
import Data.List (permutations)

rndElem :: [a] -> IO a
rndElem xs = do
  gen <- getStdGen
  index <- randomRIO (0, length xs - 1)
  return $ xs !! index

rndPermutation :: [a] -> IO [a]
rndPermutation xs = rndElem . permutations $ xs

WARNING: this may choke long lists