#!/usr/bin/perl

sub odchylenie_standardowe { sqrt( wariancja($_[0]) ) }

sub wariancja {
    my $element = shift;
    my $wariancja;
    while (($k, $v) = each %$element) {
        $wariancja += ($k ** 2) * $v;
    }
    return $wariancja - (wartosc_oczekiwana($element) ** 2);
}

%kostka = (1 => 1/8, 2 => 1/8, 3 => 1/8, 4 => 1/8, 5 => 1/4, 6 => 1/4);
print "Wariancja: ", wariancja(\%kostka), "\n";
print "Odchylenie standardowe: ", odchylenie_standardowe(\%kostka), "\n";

sub wartosc_oczekiwana {
    my ( $rozklad, $suma ) = (shift, 0);

    while ( ($wynik, $prawd) = each %$rozklad ) {
        $suma += $wynik * $prawd;
    }

    return $suma;
}