(* Random -- Moscow ML library 1995-04-23, 1999-02-24 *) type generator = {seedref : real ref} (* Generating random numbers. Paulson, page 96 *) val a = 16807.0 val m = 2147483647.0 fun nextrand seed = let val t = a*seed in t - m * real(floor(t/m)) end fun newgenseed seed = {seedref = ref (nextrand seed)}; fun newgen () = let prim_val getrealtime_ : unit -> {sec : int, usec : int} = 1 "sml_getrealtime" val {sec, usec} = getrealtime_ () in newgenseed (real sec + real usec) end fun random {seedref as ref seed} = (seedref := nextrand seed; seed / m); fun randomlist (n, {seedref as ref seed0}) = let fun h 0 seed res = (seedref := seed; res) | h i seed res = h (i-1) (nextrand seed) (seed / m :: res) in h n seed0 [] end; fun range (min, max) = if min > max then raise Fail "Random.range: empty range" else fn {seedref as ref seed} => (seedref := nextrand seed; min + (floor(real(max-min) * seed / m))); fun rangelist (min, max) = if min > max then raise Fail "Random.rangelist: empty range" else fn (n, {seedref as ref seed0}) => let fun h 0 seed res = (seedref := seed; res) | h i seed res = h (i-1) (nextrand seed) (min + floor(real(max-min) * seed / m) :: res) in h n seed0 [] end