20 lines
423 B
Erlang
20 lines
423 B
Erlang
-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).
|