started with week2
[fp1415.git] / fp2 / week2 / mart / Random.icl
1 implementation module Random
2
3 import StdFile, StdList, StdMisc, StdArray, Random
4
5 :: RandomSeed :== Int
6
7 nullRandomSeed :: RandomSeed
8 nullRandomSeed = 0
9
10 getNewRandomSeed :: !*env -> (!RandomSeed, !*env) | FileSystem env
11 getNewRandomSeed env
12 # (ok, src, env) = sfopen "/dev/urandom" FReadData env
13 | not ok => abort "could not open /dev/urandom"
14 # (bytes, src) = sfreads src 4
15 seed = foldl (\x y->(x<<8)+toInt y) 0 [c \\ c<-:bytes]
16 | otherwise => (seed, env)
17
18 random :: !RandomSeed -> .(!Int, !RandomSeed)
19 random seed = (seed>>16 bitand 0xFFFF, seed*0x08088405+1)
20