RosettaCodeData/Task/Knuth-shuffle/Standard-ML/knuth-shuffle.ml
2025-02-27 18:35:13 -05:00

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