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