39 lines
932 B
Erlang
39 lines
932 B
Erlang
-module( standard_deviation ).
|
|
|
|
-export( [add_sample/2, create/0, destroy/1, get/1, task/0] ).
|
|
|
|
-compile({no_auto_import,[get/1]}).
|
|
|
|
add_sample( Pid, N ) -> Pid ! {add, N}.
|
|
|
|
create() -> erlang:spawn_link( fun() -> loop( [] ) end ).
|
|
|
|
destroy( Pid ) -> Pid ! stop.
|
|
|
|
get( Pid ) ->
|
|
Pid ! {get, erlang:self()},
|
|
receive
|
|
{get, Value, Pid} -> Value
|
|
end.
|
|
|
|
task() ->
|
|
Pid = create(),
|
|
[add_print(Pid, X, add_sample(Pid, X)) || X <- [2,4,4,4,5,5,7,9]],
|
|
destroy( Pid ).
|
|
|
|
add_print( Pid, N, _Add ) -> io:fwrite( "Standard deviation ~p when adding ~p~n", [get(Pid), N] ).
|
|
|
|
loop( Ns ) ->
|
|
receive
|
|
{add, N} -> loop( [N | Ns] );
|
|
{get, Pid} ->
|
|
Pid ! {get, loop_calculate( Ns ), erlang:self()},
|
|
loop( Ns );
|
|
stop -> ok
|
|
end.
|
|
|
|
loop_calculate( Ns ) ->
|
|
Average = loop_calculate_average( Ns ),
|
|
math:sqrt( loop_calculate_average([math:pow(X - Average, 2) || X <- Ns]) ).
|
|
|
|
loop_calculate_average( Ns ) -> lists:sum( Ns ) / erlang:length( Ns ).
|