let permute ?random_state t =
  let state =
    match random_state with
    | None -> Random.get_state ()
    | Some state -> state
  in
  for i = Array.length t downto 2 do
    swap t (i - 1) (Random.State.int state i)
  done;
  if random_state = None then Random.set_state state