Revision: 50987
Updated Code
at January 18, 2013 15:26 by rtperson
Updated Code
-- ah, randomization. Always fun in Haskell. -- this selects only one letter. Not what we want... rnd_select_one :: [a] -> IO [a] rnd_select_one xs = do let len = (length xs) - 1 n <- randomRIO (0, len) return [(xs!!n)] -- this version allows resampling. rnd_select :: [a] -> Int -> IO [a] rnd_select xs n = do g <- sequence (replicate n (rnd_select_one xs)) return (concat g) -- Here's how to prevent re-sampling, using partition from Data.List -- like so: -- partition (`elem` "g") "abcdefghijklmn" -- --> ("g", "abcdefhijklmn") -- -- It would also be fairly trivial to use removeAt from Problem 20 rnd_select_one' :: Eq a => ([a], [a]) -> Int -> IO ([a], [a]) rnd_select_one' (acc, xs) 0 = return (acc, xs) rnd_select_one' (acc, []) _ = return (acc, []) rnd_select_one' (acc, xs) n = do let len = (length xs) - 1 d <- randomRIO (0, len) let el = (xs!!d) let (g, ys) = partition (`elem` [el]) xs let ret = (acc ++ g, ys) rnd_select_one' ret (n-1) rnd_select' :: Eq a => [a] -> Int -> IO [a] rnd_select' xs n = do j <- rnd_select_one' ([], xs) n return $ fst j
Revision: 50986
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at September 10, 2011 07:27 by rtperson
Initial Code
-- ah, randomization. Always fun in Haskell. rnd_select_one :: [a] -> IO [a] rnd_select_one xs = do let len = (length xs) - 1 n' <- randomRIO (0, len) return [(xs!!n')] -- this version allows resampling. rnd_select n xs = sequence (replicate n (rnd_select_one xs)) -- Ideally, to prevent re-sampling, we would use partition from Data.List -- like so: -- partition (`elem` "g") "abcdefghijklmn" -- --> ("g", "abcdefhijklmn") -- I'll have to revisit this one when I have a chance to -- play around with partitioning.
Initial URL
http://haskell.org/haskellwiki/99_questions/21_to_28
Initial Description
problem 23, Extract a given number of randomly selected elements from a list. Example: Prelude System.Random>rnd_select "abcdefgh" 3 >>= putStrLn "eda" Two problems: 1) How to return a list, and 2) how to sample without duplication
Initial Title
Haskell 99 Problems - Problem 23
Initial Tags
Initial Language
Haskell