RosettaCodeData/Task/Knuth-shuffle/Elixir/knuth-shuffle.elixir

23 lines
531 B
Text
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
defmodule Knuth do
def shuffle( inputs ) do
n = length( inputs )
{[], acc} = Enum.reduce( n..1, {inputs, []}, &random_move/2 )
acc
end
defp random_move( n, {inputs, acc} ) do
2016-12-05 22:15:40 +01:00
item = Enum.at( inputs, :rand.uniform(n)-1 )
2015-11-18 06:14:39 +00:00
{List.delete( inputs, item ), [item | acc]}
end
end
seq = Enum.to_list( 0..19 )
IO.inspect Knuth.shuffle( seq )
seq = [1,2,3]
Enum.reduce(1..100000, Map.new, fn _,acc ->
k = Knuth.shuffle(seq)
2016-12-05 22:15:40 +01:00
Map.update(acc, k, 1, &(&1+1))
2015-11-18 06:14:39 +00:00
end)
|> Enum.each(fn {k,v} -> IO.inspect {k,v} end)