#!/usr/bin/perl 

# $wybor = losowy_rozklad_wazony( \%rozklad, \@kolejnosc_kluczy, $suma_wag )
#   Wybiera element z %rozklad. Mozliwe jest przekazanie lub obliczenie sumy
#   wag i kluczy posortowanych wedlug wag.
sub losowy_rozklad_wazony {
    my( $rozklad, $kolejnosc_kluczy, $suma_wag ) = @_;
    my $biezaca_waga;

    $kolejnosc_kluczy = [ sort { $rozklad->{$a} <=> $rozklad->{$b} } keys %$rozklad ]
        unless $kolejnosc_kluczy;
    unless ( $suma_wag ) {
        foreach (@$kolejnosc_kluczy) { $suma_wag += $rozklad->{$_} }
    }

    # Uzyskanie losowej wartosci.
    my $los = rand( $suma_wag );

    # Uzycie losowej wartosci do ustalenia klucza.
    foreach my $klucz (@$kolejnosc_kluczy) {
        return $klucz if ($biezaca_waga += $rozklad->{$klucz}) >= $los;
    }
}

%wagi_kolorow = ( pomaranczowe => 3,
                  zielone      => 10,
                  rozowe       => 8,
                  brazowe      => 10,
                  biale        => 0,
                  czerwone     => 6,
                  niebieskie   => 11,
                  zolte        => 7,
                  fioletowe    => 5   );

print losowy_rozklad_wazony( \%wagi_kolorow ), "\n";

$wagi_kolorow = 0;
@kolejnosc_kolorow = sort { $wagi_kolorow{$a} <=> $wagi_kolorow{$b} } keys 
  %wagi_kolorow;
for (@kolejnosc_kolorow) { $waga_koloru += $waga_koloru{$_} }

for ( 0..50 ) {
    print losowy_rozklad_wazony( \%rozklad_kolorow, \@kolejnosc_kolorow, $waga_kolorow ), "\n";
}

