fp2-w1: RandomGetallen
authorCamil Staps <info@camilstaps.nl>
Sat, 18 Apr 2015 13:34:17 +0000 (15:34 +0200)
committerCamil Staps <info@camilstaps.nl>
Sat, 18 Apr 2015 13:34:17 +0000 (15:34 +0200)
fp2/week1/camil/RandomGetallen.dcl [new file with mode: 0644]
fp2/week1/camil/RandomGetallen.icl [new file with mode: 0644]

diff --git a/fp2/week1/camil/RandomGetallen.dcl b/fp2/week1/camil/RandomGetallen.dcl
new file mode 100644 (file)
index 0000000..2ca4b27
--- /dev/null
@@ -0,0 +1,7 @@
+definition module RandomGetallen\r
+\r
+import Random\r
+\r
+random_n       :: Int RandomSeed -> ([Int],RandomSeed)\r
+random_inf     ::     RandomSeed ->  [Int]\r
+shuffle                :: [a] RandomSeed ->  [a]\r
diff --git a/fp2/week1/camil/RandomGetallen.icl b/fp2/week1/camil/RandomGetallen.icl
new file mode 100644 (file)
index 0000000..a0a21bf
--- /dev/null
@@ -0,0 +1,29 @@
+implementation module RandomGetallen\r
+\r
+import StdEnv, Random\r
+\r
+random_n :: Int RandomSeed -> ([Int],RandomSeed)\r
+random_n 0 seed = ([], seed)\r
+random_n n seed = ([r:rs], s`)\r
+where \r
+       (rs,s`) = random_n (n-1) s\r
+       (r,s) = random seed     \r
+\r
+random_inf :: RandomSeed -> [Int]\r
+random_inf s = iterateSt random s\r
+\r
+iterateSt :: (s -> (a,s)) s -> [a]\r
+iterateSt f s = [a : iterateSt f s`]\r
+where\r
+       (a,s`) = f s\r
+\r
+shuffle :: [a] RandomSeed -> [a]\r
+shuffle xs s = (perms xs)!!(fst (random s) rem (factorial (length xs)))\r
+\r
+perms :: [a] -> [[a]]\r
+perms [] = [[]]\r
+perms xs = [[xs!!i : xs`] \\ i <- [0..length xs - 1] , xs` <- perms (take i xs ++ drop (i+1) xs)]\r
+\r
+factorial :: Int -> Int\r
+factorial 0 = 1\r
+factorial n = n * factorial (n-1)\r