summaryrefslogtreecommitdiff
path: root/fp2/week2/mart/oldold/old/Random.icl
blob: b6e076898c9fed8609fcb4bb0eed12d49e7d9dc7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
implementation module Random

import StdFile, StdList, StdMisc, StdArray, Random

:: RandomSeed :== Int

nullRandomSeed :: RandomSeed
nullRandomSeed = 0

getNewRandomSeed :: !*env -> (!RandomSeed, !*env) | FileSystem env
getNewRandomSeed env
# (ok, src, env) = sfopen "/dev/urandom" FReadData env
| not ok => abort "could not open /dev/urandom"
# (bytes, src)   = sfreads src 4
  seed           = foldl (\x y->(x<<8)+toInt y) 0 [c \\ c<-:bytes]
| otherwise => (seed, env)

random :: !RandomSeed -> .(!Int, !RandomSeed)
random seed = (seed>>16 bitand 0xFFFF, seed*0x08088405+1)