12345678910111213141516171819202122232425262728293031323334letarray_shuffle?statea=letrandom_intstaten=matchstatewith|None ->Random.intn|Somes->Random.State.intsninforn=Array.lengtha-1downto1doletk=random_intstate(n+1)inifk<>nthen beginletbuf=Array.unsafe_getaninArray.unsafe_setan(Array.unsafe_getak);Array.unsafe_setakbufenddone(*$QQ.(array_of_size Gen.(2--15) small_int) (fun a -> \
let a' = Array.copy a in \
array_shuffle a'; \
(Array.to_list a' |> List.sort BatInt.compare) = \
(Array.to_list a |> List.sort BatInt.compare))
*)(*$R
let rec fact = function 0 -> 1 | n -> n * fact (n - 1) in
let length = 5 in
let test = Array.init length (fun i -> i) in (* all elements must be distinct *)
let permut_number = fact length in
let histogram = Hashtbl.create permut_number in
for i = 1 to 50_000 do
let a = Array.copy test in
array_shuffle a;
Hashtbl.replace histogram a ();
done;
assert_bool "all permutations occur" (Hashtbl.length histogram = permut_number)
*)