23 lines
481 B
OCaml
23 lines
481 B
OCaml
val rng = ref (SplitMix64.init NONE)
|
|
|
|
fun getRandInt max =
|
|
let
|
|
val (rng', next) = SplitMix64.nextRange (0, max)
|
|
val () = rng := rng'
|
|
in
|
|
Word64.toInt next
|
|
end
|
|
|
|
fun knuthShuffle a =
|
|
let
|
|
val i = ref ((Array.length a) - 1)
|
|
in
|
|
while !i > 0 do
|
|
let
|
|
val a_i = Array.sub (a, !i)
|
|
val j = getRandInt !i
|
|
val a_j = Array.sub (a, j)
|
|
in
|
|
(Array.update (a, !i, a_j); Array.update (a, j, a_i); i := (!i - 1))
|
|
end
|
|
end
|