Add some Haskell code for shuffling a list.
Chris Pressey
1 year, 4 months ago
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 |