src/Tools/Spec_Check/random.ML
changeset 74189 d4af818e0880
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Tools/Spec_Check/random.ML	Fri Jul 09 10:36:20 2021 +0200
@@ -0,0 +1,46 @@
+(*  Title:      Tools/Spec_Check/random.ML
+    Author:     Lukas Bulwahn and Nicolai Schaffroth, TU Muenchen
+    Author:     Christopher League
+
+Random number engine.
+*)
+
+signature RANDOM =
+sig
+  type rand
+  val new : unit -> rand
+  val range : int * int -> rand -> int * rand
+  val split : rand -> rand * rand
+end
+
+structure Random : RANDOM  =
+struct
+
+type rand = real
+
+val a = 16807.0
+val m = 2147483647.0
+
+fun nextrand seed =
+  let
+    val t = a * seed
+  in
+    t - m * real(floor(t/m))
+  end
+
+val new = nextrand o Time.toReal o Time.now
+
+fun range (min, max) =
+  if min > max then raise Domain (* TODO: raise its own error *)
+  else fn r => (min + (floor(real(max-min+1) * r / m)), nextrand r)
+
+fun split r =
+  let
+    val r = r / a
+    val r0 = real(floor r)
+    val r1 = r - r0
+  in
+    (nextrand r0, nextrand r1)
+  end
+
+end