// Mersenne Twister.
// This code is placed into the public domain.
#light
open UInt32
type state = { mt : uint32 array; mutable mti : int; }
let n = 624
let m = 397
let upper_mask = 0x80000000u
let lower_mask = 0x7fffffffu
let mag01 = [| 0u; 0x9908b0dfu |]
let mask_b = 0x9d2c5680u
let mask_c = 0xefc60000u
let init_state () = { mt = Array.create n 0u; mti = n+1; }
let state = init_state ()
let init_genrand seed =
let ml = 1812433253u
let mfill = 0xffffffffu
state.mt.[0] <- (seed &&& mfill)
for i = 1 to n - 1 do
let mtprev = state.mt.[i - 1]
state.mt.[i] <- (ml * (mtprev ^^^ (mtprev >>> 30)) + (of_int i))
let init_by_array key =
init_genrand 19650218u
let i = ref 1
let j = ref 0
let k = ref (max n (Array.length key))
let mval1 = 1664525u
let mval2 = 1566083941u
while !k > 0 do
let mtprev = state.mt.[!i - 1]
state.mt.[!i] <- (state.mt.[!i] ^^^ ((mtprev ^^^ (mtprev >>> 30)) * mval1)) + key.[!j] + (of_int !j)
incr i
incr j
if !i >= n then
state.mt.[0] <- state.mt.[n - 1]
i := 1
if !j >= Array.length key then j := 0
decr k
k := n - 1
while !k > 0 do
let mtprev = state.mt.[!i - 1]
state.mt.[!i] <- (state.mt.[!i] ^^^ ((mtprev ^^^ (mtprev >>> 30)) * mval2)) - (of_int !i)
incr i
if !i >= n then
state.mt.[0] <- state.mt.[n - 1]
i := 1
decr k
state.mt.[0] <- 0x80000000u
let genrand_int32 () =
if (state.mti >= n) then
if (state.mti = n+1) then init_genrand 5489u
let y = ref 0u
for i = 0 to n - m - 1 do
y := ((state.mt.[i] &&& upper_mask) ||| (state.mt.[i + 1] &&& lower_mask))
state.mt.[i] <- state.mt.[i + m] ^^^ (!y >>> 1) ^^^ (mag01.[to_int (!y &&& one)])
for i = n - m to n - 2 do
y := (state.mt.[i] &&& upper_mask) ||| (state.mt.[i + 1] &&& lower_mask)
state.mt.[i] <- state.mt.[i + m - n] ^^^ (!y >>> 1) ^^^ (mag01.[to_int (!y &&& one)])
y := (state.mt.[n - 1] &&& upper_mask) ||| (state.mt.[0] &&& lower_mask)
state.mt.[n - 1] <- state.mt.[m - 1] ^^^ (!y >>> 1) ^^^ (mag01.[to_int (!y &&& one)])
state.mti <- 0
let y = ref (state.mt.[state.mti])
y := !y ^^^ (!y >>> 11)
y := !y ^^^ ((!y <<< 7) &&& 0x9d2c5680u)
y := !y ^^^ ((!y <<< 15) &&& 0xefc60000u)
y := !y ^^^ (!y >>> 18)
state.mti <- state.mti + 1
!y
let genrand_int31 () = (to_int32 (genrand_int32 () >>> 1))
let genrand_real1 () = (System.Convert.ToDouble (genrand_int32 ())) * (1.0 / 4294967295.0)
let genrand_real2 () = (System.Convert.ToDouble (genrand_int32 ())) * (1.0 / 4294967296.0)
let genrand_real3 () = ((System.Convert.ToDouble (genrand_int32 ())) + 0.5) * (1.0 / 4294967296.0)
// 1000 outputs of genrand_int32
let test0 () =
for i = 0 to 999 do
Printf.printf "%10A " (genrand_int32 ())
if (i % 5 = 4) then Printf.printf "\n"
// 1000 outputs of genrand_int31
let test1 () =
for i = 0 to 999 do
Printf.printf "%10d " (genrand_int31 ())
if (i % 5 = 4) then Printf.printf "\n"
// 1000 output of genrand_real2
let test2 () =
for i = 0 to 999 do
Printf.printf "%10.8f " (genrand_real2 ())
if (i % 5 = 4) then Printf.printf "\n"