How to retrieve a row, biased by populatity?

Yitzchak Scott-Thoennes sthoenna at
Wed Aug 22 03:35:55 BST 2012

The single pass approach, as given in perlfaq "How do I select a
random line from a file?" adapts to work here too.

my $total_weight = 0;
my $selected;
while ( my $record = get_next_record() ) {
    my $weight = weight($record);
    $total_weight += $weight;
    $selected = $record if $weight > $total_weight * rand;

Weights can be integers or floating point, but must be >= 0.  A record
is guaranteed to be selected unless all weights are 0 or there are no

More information about the mailing list