rare zooi
[fp1415.git] / fp2 / week1 / mart / RandomGetallen.icl
1 implementation module RandomGetallen
2
3 import StdEnv, Random
4
5 //Start :: *World -> ([Int],*World)
6 //Start world
7 //# (rs,world) = getNewRandomSeed world
8 //= (shuffle [1..10] rs,world)
9
10
11 Start = shuffle [1..10] nullRandomSeed
12
13 random_n :: Int RandomSeed -> ([Int],RandomSeed)
14 random_n n seed = seqList (repeatn n random) seed
15
16 random_inf :: RandomSeed -> [Int]
17 random_inf seed = iterateSt random seed
18
19 iterateSt :: (s -> (a,s)) s -> [a]
20 iterateSt f s = [a : iterateSt f s`]
21 where
22 (a,s`) = f s
23
24 shuffle :: [a] RandomSeed -> [a]
25 shuffle xs seed = (perms xs) !! ((fst (random seed)) rem (fac (length xs)))
26
27 fac :: Int -> Int
28 fac 0 = 1
29 fac n = n * fac (n-1)
30
31 perms :: [a] -> [[a]]
32 perms [] = [[]]
33 perms xs = [[xs!!i : xs`] \\ i <- [0..length xs - 1] , xs` <- perms (take i xs ++ drop (i+1) xs)]