#! perl -slw use strict; use Data::Dump qw[ pp ]; sub genPickerConverted { my %kmer_prob = %{ $_[0] }; my @vals = keys %kmer_prob; my @odds = (); foreach my $val (@vals) { push (@odds, $kmer_prob{$val}); } my @order = sort{ $odds[ $a ] <=> $odds[ $b ] } 0 .. $#odds; @odds = @odds[ @order ]; @vals = @vals[ @order ]; my $t = 0; $t += $_ for @odds; $_ /= $t for @odds; $odds[ $_ + 1 ] += $odds[ $_ ] for 0 .. $#odds - 1; return sub { my $r = rand(); $r < $odds[ $_ ] and return $vals[ $_ ] for 0 .. $#odds; }; } my %kmer_probe = map{ split( ' ' ) } ; pp \%kmer_probe; my $picker = genPickerConverted( \%kmer_probe ); my %tally; ++$tally{ $picker->() } for 1 .. 1e6; pp \%tally; __DATA__ A 1e-7 B 20e-7 C 10e-5 #### C:\test>junk997.pl { A => 1e-7, B => 20e-7, C => 10e-5 } { A => 971, B => 19509, C => 979520 }