functor MKRANDOM() = struct (* Given a seed, mkRandom returns a psuedo-random number generator which takes an integer argument of one more than the maximum return value required. ( Linear Congruential, after Sedgewick, "Algorithms", Addison-Wesley, 1983, Chapter 3 pp 37-38.) *) fun mkRandom seed = let val r = ref seed val a = 31415821 val m = 100000011 fun f n = let val rand = (r := ((a * !r + 1) mod m); (!r * n) div m) in if n < 0 then rand + 1 else rand end in f end; end;