import System.Random import Data.List rnd_select :: [a] -> Int -> IO [a] rnd_select _ 0 = return [] rnd_select (x:xs) n = do r <- randomRIO (0, (length xs)) if r < n then do rest <- rnd_select xs (n-1) return (x : rest) else rnd_select xs n rnd_select' xs n = do gen <- getStdGen return $ take n [ xs !! x | x <- randomRs (0, (length xs) - 1) gen] rnd_select'' :: Int -> [a] -> [a] rnd_select'' n x = map (x!!) is where is = take n . nub $ randomRs (0, length x - 1) (mkStdGen 100)