my @items = ( ["foo", 1], ["bar", 3], ["baz", 4], ["quux", 9] ); #### use List::Util; my $total_weight = List::Util::sum(map { $_->[1] } @items); #### my $pick = int(rand($total_weight)); my $picked_item = (List::Util::first { $pick -= $_->[1]; $pick < 0 } @items)->[0];