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)
|