32 lines
851 B
Erlang
32 lines
851 B
Erlang
mean(Values) ->
|
|
mean(tl(Values), hd(Values), 1).
|
|
|
|
mean([], Acc, Length) ->
|
|
Acc / Length;
|
|
mean(Values, Acc, Length) ->
|
|
mean(tl(Values), hd(Values)+Acc, Length+1).
|
|
|
|
variance(Values) ->
|
|
Mean = mean(Values),
|
|
variance(Values, Mean, 0) / length(Values).
|
|
|
|
variance([], _, Acc) ->
|
|
Acc;
|
|
variance(Values, Mean, Acc) ->
|
|
Diff = hd(Values) - Mean,
|
|
DiffSqr = Diff * Diff,
|
|
variance(tl(Values), Mean, Acc + DiffSqr).
|
|
|
|
stddev(Values) ->
|
|
math:sqrt(variance(Values)).
|
|
|
|
normal(Mean, StdDev) ->
|
|
U = random:uniform(),
|
|
V = random:uniform(),
|
|
Mean + StdDev * ( math:sqrt(-2 * math:log(U)) * math:cos(2 * math:pi() * V) ). % Erlang's math:log is the natural logarithm.
|
|
|
|
main(_) ->
|
|
X = [ normal(1.0, 0.5) || _ <- lists:seq(1, 1000) ],
|
|
io:format("mean = ~w\n", [mean(X)]),
|
|
io:format("stddev = ~w\n", [stddev(X)]).
|