|
Posted by Matt Raines on 05/24/05 13:58
On Mon, 23 May 2005, Ewoud Dronkert wrote:
> On 23 May 2005 06:38:08 -0700, Hans A wrote:
>> pick two random numbers between 1 and the total number of lines
>> in the textfile, and then try to read out these line numbers
You don't need to know the number of lines in the text file before you
start to select one line at random.
Reading a line at a time from the file, just update the selected line if
floor(mt_rand(0, $currentLineNumber - 1)) is 0. At the end, your selected
line is a fair and random choice, but you don't need to store more than 2
lines in memory at any one time and there's no need to count the lines
first.
Something like:
<?php
$file = fopen($filename);
$counter = 0;
while (($line = fgets($file)) !== false) {
if (floor(mt_rand(0, $counter++)) == 0) {
$selectedLine = $line;
}
}
fclose($file);
[... do something with $selectedLine ...]
?>
If there's one line, it always matches, since mt_rand(0, 0) always returns
0.
If there are two lines, there is a 1 in 2 chance the second line will
overwrite our $selectedLine.
By the third iteration, the 1 in 3 chance the third line will match is
split evenly (on average) between the matches and non-matches for the
second line, if you see what I mean, leaving a 1 in 3 chance for each of
the three lines. And so ad nauseum.
Fairly applying the requirement to select *two* lines at random, you might
have to run through the file twice, ignoring the line you selected last
time. In this case you'd need to store the selected line's index as well
as its content. Or you could just add a second if statement to the loop,
but you'd have to work around the chance of selecting the same line twice.
--
Matt
Navigation:
[Reply to this message]
|