in reply to reading a random line from a file
Prefetch the line locations and then randomly pick one has an even distribution so the chance of picking a short like is the same as a long line.
Randomly picking a possition and moving to the head/end of the current record will be distorted by the length of the record. Longer records will have a higher probability o being picked than short records.
However you can combine the methods if you are using fixed length records.
Technically ypu should lock the file so it does not change beween getting its length and getting the random record but generally that is not a massive issue. Hope this helpsmy $record_length=200; # set the record length open my $fh,'<',$filename or die $!; # open handle my $size = -s $fh; # get the file size my $records=$size/$record_length; # workout the number of records seek $fh, rand($records)*$record_length, 0;# move to a random record my $randomline = <$fh>; # read that record close $fh; # Close handle
UnderMine
|
|---|