src/Pure/General/random.ML
changeset 62585 5d4ed917450d
parent 59720 f893472fff31
equal deleted inserted replaced
62584:6cd36a0d2a28 62585:5d4ed917450d
       
     1 (*  Title:      Pure/General/random.ML
       
     2     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
       
     3 
       
     4 Pseudo random numbers.
       
     5 *)
       
     6 
       
     7 signature RANDOM =
       
     8 sig
       
     9   val random: unit -> real
       
    10   exception RANDOM
       
    11   val random_range: int -> int -> int
       
    12 end;
       
    13 
       
    14 structure Random: RANDOM =
       
    15 struct
       
    16 
       
    17 fun rmod x y = x - y * Real.realFloor (x / y);
       
    18 
       
    19 local
       
    20   val a = 16807.0;
       
    21   val m = 2147483647.0;
       
    22   val random_seed = Synchronized.var "random_seed" 1.0;
       
    23 in
       
    24 
       
    25 fun random () =
       
    26   Synchronized.change_result random_seed
       
    27     (fn r => let val r' = rmod (a * r) m in (r', r') end);
       
    28 
       
    29 end;
       
    30 
       
    31 exception RANDOM;
       
    32 
       
    33 fun random_range l h =
       
    34   if h < l orelse l < 0 then raise RANDOM
       
    35   else l + Real.floor (rmod (random ()) (real (h - l + 1)));
       
    36 
       
    37 end;
       
    38