my $RUNS = 100_000; my $data = [[a => 0.1], [b => 0.5], [c => 0.4]]; my %count; foreach (1 .. $RUNS) { my $pick; my $w = 0; rand($w += $$_[1]) < $$_[1] and $pick = $$_[0] for @$data; $count{$pick}++; } while (my ($k, $v) = each %count) { printf "%s: %5.2f%%\n", $k, 100 * $v / $RUNS; } __END__ c: 39.88% a: 9.93% b: 50.19%