git @ Cat's Eye Technologies The-Dipple / d929964
Add some Haskell code for shuffling a list. Chris Pressey 1 year, 4 months ago
1 changed file(s) with 33 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 import System.Random
1 import Debug.Trace
2
3 pickAt :: [a] -> Int -> (a, [a])
4 pickAt items@(x:xs) n
5 | n == 0 = (x, xs)
6 | n < 0 = error "range"
7 | otherwise =
8 let
9 (r, rs) = pickAt xs (n-1)
10 in
11 (r, x:rs)
12
13 randomIndex xs gen =
14 uniformR (0 :: Int, ((length xs) - 1) :: Int) gen
15
16 pickOne xs gen =
17 let
18 (index, gen') = randomIndex xs gen
19 (x, xs') = pickAt xs index
20 in
21 (x, xs', gen')
22
23 shuffle [] gen = ([], gen)
24 shuffle xs gen =
25 let
26 (x, xs', gen') = pickOne xs gen
27 (xs'', gen'') = shuffle xs' gen'
28 in
29 (x:xs'', gen'')
30
31 -- for demoing purposes
32 shuffleSeed items seed = fst $ shuffle items $ mkStdGen seed