#!/usr/bin/perl

sub standard_deviation { sqrt( variance($_[0]) ) }

sub variance {
    my $distref = shift;
    my $variance;
    while (($k, $v) = each %$distref) {
        $variance += ($k ** 2) * $v;
    }
    return $variance - (expected_value($distref) ** 2);
}

%die = (1 => 1/8, 2 => 1/8, 3 => 1/8, 4 => 1/8, 5 => 1/4, 6 => 1/4);
print "Variance: ", variance(\%die), "\n";
print "Standard deviation: ", standard_deviation(\%die), "\n";

sub expected_value {
    my ( $dist, $total ) = (shift, 0);

    while ( ($outcome, $prob) = each %$dist ) {
        $total += $outcome * $prob;
    }

    return $total;
}

