Current section
Files
Jump to
Current section
Files
lib/knuth.ex
defmodule Knuth do
@moduledoc """
The Elixir implementation of the Knuth shuffle(a.k.a Fisher Yates shuffle) algorithm.
"""
@doc """
"""
def shuffle(list), do: _shuffle(list, length(list), [])
defp _shuffle([h|_t],1,result), do: [h|result] # when n = 1
defp _shuffle(list,n,[]) do # when n = list.length
r=:rand.uniform(n)
_shuffle(List.replace_at(list, r-1, List.last(list)),n-1,[r])
end
defp _shuffle(list,n,result) do
r=:rand.uniform(n) # a random number from 0 to n-1 inclusive
vR=Enum.at(list,r-1) # list value at r
vE=Enum.at(list,n-1) # list value at n-1
_shuffle(List.replace_at(list, r-1, vE),n-1,[vR|result])
end
end