src/Pure/General/random.ML
author wenzelm
Fri, 17 Mar 2017 20:33:27 +0100
changeset 65292 e3bd1e7ddd23
parent 62585 5d4ed917450d
permissions -rw-r--r--
more robust JDBC initialization, e.g. required for Isabelle/jEdit startup;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62585
5d4ed917450d clarified files;
wenzelm
parents: 59720
diff changeset
     1
(*  Title:      Pure/General/random.ML
59172
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     2
    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     3
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     4
Pseudo random numbers.
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     5
*)
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     6
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     7
signature RANDOM =
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     8
sig
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
     9
  val random: unit -> real
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    10
  exception RANDOM
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    11
  val random_range: int -> int -> int
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    12
end;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    13
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    14
structure Random: RANDOM =
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    15
struct
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    16
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    17
fun rmod x y = x - y * Real.realFloor (x / y);
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    18
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    19
local
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    20
  val a = 16807.0;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    21
  val m = 2147483647.0;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    22
  val random_seed = Synchronized.var "random_seed" 1.0;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    23
in
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    24
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    25
fun random () =
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    26
  Synchronized.change_result random_seed
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    27
    (fn r => let val r' = rmod (a * r) m in (r', r') end);
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    28
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    29
end;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    30
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    31
exception RANDOM;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    32
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    33
fun random_range l h =
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    34
  if h < l orelse l < 0 then raise RANDOM
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    35
  else l + Real.floor (rmod (random ()) (real (h - l + 1)));
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    36
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    37
end;
d1c500e0a722 separate module Random;
wenzelm
parents:
diff changeset
    38