When you need to be more accurate than average, you need standard deviation bro…
#!/usr/bin/perl
use strict;
print standard_deviation(1,2,3,4,5,6,7,8,9,10)."\n";
sub standard_deviation {
my(@numbers) = @_;
#Prevent division by 0 error in case you get junk data
return undef unless(scalar(@numbers));
# Step 1, find the mean of the numbers
my $total1 = 0;
foreach my $num (@numbers) {
$total1 += $num;
}
my $mean1 = $total1 / (scalar @numbers);
# Step 2, find the mean of the squares of the differences
# between each number and the mean
my $total2 = 0;
foreach my $num (@numbers) {
$total2 += ($mean1-$num)**2;
}
my $mean2 = $total2 / (scalar @numbers);
# Step 3, standard deviation is the square root of the
# above mean
my $std_dev = sqrt($mean2);
return $std_dev;
}
Here’s a rewrite of your standard deviation script in ruby if any of your visitors would be into that sort of thing:
#!/usr/bin/env ruby
#
def standard_deviation(*numbers)
return if numbers.size == 0
count = numbers.size
sum = numbers.reduce(&:+).to_f
mean = sum / count
sum_of_squares = numbers.reduce(0) { |r, n|
r + ((n – mean).abs ** 2)
}
variance = sum_of_squares / count
Math.sqrt(variance)
end
puts standard_deviation(1,2,3,4,5,6,7,8,9,10)
Nice!!
And here is the same program implemented in Haskell:
stdDev :: Floating a => [a] -> a
–What we get if we have an empty list
stdDev [] = 0
–Take square root of the Variance
stdDev xs = sqrt $ (sum $ map (^2) xs) / l – (sum xs / l) ^ 2
where l = fromIntegral $ length xs