-module(duml). -export([shuffle/1]). shuffle([]) -> []; shuffle([X]) -> [X]; shuffle(Items) -> N = rand:uniform(length(Items)), {Nth, Rest} = inverse_nth(N, Items), [Nth | shuffle(Rest)]. inverse_nth(N, Items) -> inverse_nth([], N, Items). inverse_nth(Stk, 1, [X | Rest]) -> {X, lists:reverse(Stk, Rest)}; inverse_nth(Stk, N, [X | Rest]) when N > 1 -> inverse_nth([X | Stk], N-1, Rest).