如何在OCaml中测试随机模块?

时间:2014-04-09 15:01:12

标签: random ocaml

OCaml有一个Random module,我想知道它是如何测试自己的随机性。但是,我不清楚他们究竟在做什么。我理解它尝试用另外两个依赖项测试来测试chi-square。以下是测试部分的代码:

卡方检验

(* Return the sum of the squares of v[i0,i1[ *)
let rec sumsq v i0 i1 =
  if i0 >= i1 then 0.0
  else if i1 = i0 + 1 then Pervasives.float v.(i0) *. Pervasives.float v.(i0)
  else sumsq v i0 ((i0+i1)/2) +. sumsq v ((i0+i1)/2) i1
;;

let chisquare g n r =
  if n <= 10 * r then invalid_arg "chisquare";
  let f = Array.make r 0 in
  for i = 1 to n do
    let t = g r in
    f.(t) <- f.(t) + 1
  done;
  let t = sumsq f 0 r
  and r = Pervasives.float r
  and n = Pervasives.float n in
  let sr = 2.0 *. sqrt r in
  (r -. sr,   (r *. t /. n) -. n,   r +. sr)
;;

Q1:,他们为什么这样写sum of squares

似乎只是在总结所有方块。为什么不这样写:

let rec sumsq v i0 i1 =
  if i0 >= i1 then 0.0
  else Pervasives.float v.(i0) *. Pervasives.float v.(i0) + (sumsq v (i0+1) i1)

Q2:,为什么他们似乎对chisquare使用不同的方式?

来自chi squared test wiki,他们的公式是

enter image description here

但似乎他们正在使用不同的公式,幕后背后是什么?


其他两个依赖项测试

(* This is to test for linear dependencies between successive random numbers.
*)
let st = ref 0;;
let init_diff r = st := int r;;
let diff r =
  let x1 = !st
  and x2 = int r
  in
  st := x2;
  if x1 >= x2 then
    x1 - x2
  else
    r + x1 - x2
;;

let st1 = ref 0
and st2 = ref 0
;;

(* This is to test for quadratic dependencies between successive random
   numbers.
*)
let init_diff2 r = st1 := int r; st2 := int r;;
let diff2 r =
  let x1 = !st1
  and x2 = !st2
  and x3 = int r
  in
  st1 := x2;
  st2 := x3;
  (x3 - x2 - x2 + x1 + 2*r) mod r
;;

Q3:我真的不知道这两个测试,有人可以点亮我吗?

0 个答案:

没有答案