(************************************************************ random.ml Created : Wed Jul 31 15:07:54 2002 Last modified: Wed Jul 31 16:46:11 2002 Compile: ocamlc -g random.ml -o random # Compile: ocamlopt.opt random.ml -o random # ************************************************************) let random seed lambda e mu = let current = ref seed in (* result の初期値は1 *) let rec get_p e result = if e = 0 then result else get_p (e-1) (2*result) in let p = get_p e 1 in (* let _ = Printf.printf "p = %d\n" p in*) fun () -> let result = !current in begin current := (lambda*result + mu) mod p; result end module ComparebleInt = struct type t = int let compare x y = if x < y then -1 else if x = y then 0 else 1 end module IntSet = (Set.Make(ComparebleInt) : sig type t val add: int -> t -> t val mem: int -> t -> bool val empty: t end) let _ = let seed = 2 in let lambda = 3 in let e = 4 in let mu = 0 in let r = random seed lambda e mu in let s = ref IntSet.empty in let i = ref 1 in let current = ref (r ()) in while not (IntSet.mem !current !s) do Printf.printf "%2d: %d\n" !i !current; s := IntSet.add !current !s; current := r (); Printf.printf "NEXT %d\n" !current; incr i; done