23 lines
531 B
Plaintext
23 lines
531 B
Plaintext
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
|
|
item = Enum.at( inputs, :rand.uniform(n)-1 )
|
|
{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)
|
|
Map.update(acc, k, 1, &(&1+1))
|
|
end)
|
|
|> Enum.each(fn {k,v} -> IO.inspect {k,v} end)
|