theory Random imports List Groups_List Code_Numeral begin
subsection \<open>Auxiliary functions\<close>
fun log :: "natural \ natural \ natural" where "log b i = (if b \ 1 \ i < b then 1 else 1 + log b (i div b))"
definition inc_shift :: "natural \ natural \ natural" where "inc_shift v k = (if v = k then 1 else k + 1)"
definition minus_shift :: "natural \ natural \ natural \ natural" where "minus_shift r k l = (if k < l then r + k - l else k - l)"
subsection \<open>Random seeds\<close>
type_synonym seed = "natural \ natural"
primrec"next" :: "seed \ natural \ seed" where "next (v, w) = (let
k = v div 53668;
v' = minus_shift 2147483563 ((v mod 53668) * 40014) (k * 12211);
l = w div 52774;
w' = minus_shift 2147483399 ((w mod 52774) * 40692) (l * 3791);
z = minus_shift 2147483562 v' (w' + 1) + 1 in (z, (v', w')))"
definition split_seed :: "seed \ seed \ seed" where "split_seed s = (let
(v, w) = s;
(v', w') = snd (next s);
v'' = inc_shift 2147483562 v;
w'' = inc_shift 2147483398 w in ((v'', w'), (v', w'')))"
subsection \<open>Base selectors\<close>
context includes state_combinator_syntax begin
fun iterate :: "natural \ ('b \ 'a \ 'b \ 'a) \ 'b \ 'a \ 'b \ 'a" where "iterate k f x = (if k = 0 then Pair x else f x \\ iterate (k - 1) f)"
definition range :: "natural \ seed \ natural \ seed" where "range k = iterate (log 2147483561 k)
(\<lambda>l. next \<circ>\<rightarrow> (\<lambda>v. Pair (v + l * 2147483561))) 1 \<circ>\<rightarrow> (\<lambda>v. Pair (v mod k))"
code_reflect Random_Engine
functions range select select_weight
ML \<open> structure Random_Engine =
struct
open Random_Engine;
type seed = Code_Numeral.natural * Code_Numeral.natural;
local
val seed = Unsynchronized.ref
(let
val now = Time.toMilliseconds (Time.now ());
val (q, s1) = IntInf.divMod (now, 2147483562);
val s2 = q mod 2147483398; in apply2 Code_Numeral.natural_of_integer (s1 + 1, s2 + 1) end);
in
fun next_seed () = let
val (seed1, seed') = @{code split_seed} (! seed)
val _ = seed := seed' in
seed1 end
fun run f = let
val (x, seed') = f (! seed);
val _ = seed := seed' in x end;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.