29 lines
863 B
Elixir
29 lines
863 B
Elixir
defmodule Permutation do
|
|
def statistic(ab, a) do
|
|
sumab = Enum.sum(ab)
|
|
suma = Enum.sum(a)
|
|
suma / length(a) - (sumab - suma) / (length(ab) - length(a))
|
|
end
|
|
|
|
def test(a, b) do
|
|
ab = a ++ b
|
|
tobs = statistic(ab, a)
|
|
{under, count} = Enum.reduce(comb(ab, length(a)), {0,0}, fn perm, {under, count} ->
|
|
if statistic(ab, perm) <= tobs, do: {under+1, count+1},
|
|
else: {under , count+1}
|
|
end)
|
|
under * 100.0 / count
|
|
end
|
|
|
|
defp comb(_, 0), do: [[]]
|
|
defp comb([], _), do: []
|
|
defp comb([h|t], m) do
|
|
(for l <- comb(t, m-1), do: [h|l]) ++ comb(t, m)
|
|
end
|
|
end
|
|
|
|
treatmentGroup = [85, 88, 75, 66, 25, 29, 83, 39, 97]
|
|
controlGroup = [68, 41, 10, 49, 16, 65, 32, 92, 28, 98]
|
|
under = Permutation.test(treatmentGroup, controlGroup)
|
|
:io.fwrite "under = ~.2f%, over = ~.2f%~n", [under, 100-under]
|