sub pick_one { my($from,$to) = @_; for(my $i=$from;$i<=$to;$i++) { return $i if(rand(1) <= 1/($to-$i+1)); } } #### sub pick_n { my($n,$from,$to) = @_; my(@picked); for(my $i=$from;$i<=$to;$i++) { if(rand(1) <= ($n/($to-$i+1))) { push(@picked,$i); $n--; } } return @picked; } #### my(@counts); for(my $i=0;$i<100000;$i++) { foreach my $c (pick_n(3,1,10)) { $counts[$c]++; } } for(my $c=0;$c<=$#counts;$c++) { print "Count[$c] = $counts[$c]\n"; } #### Count[0] = Count[1] = 29974 Count[2] = 30044 Count[3] = 29860 Count[4] = 29949 Count[5] = 30167 Count[6] = 30253 Count[7] = 29808 Count[8] = 30092 Count[9] = 29830 Count[10] = 30028