Moh*_*uur 17
我们说的文件有多大?简单的方法是将整个文件作为字符串数组加载到内存中,并从0到N中选择一个随机数组索引并显示该行.
如果文件的大小真的很大,那么你必须实现某种流式解决方案..
以下解决方案将从相对较大的文件中生成均匀分布的随机行,每个文件的最大行大小可调.
<?php
function rand_line($fileName, $maxLineLength = 4096) {
$handle = @fopen($fileName, "r");
if ($handle) {
$random_line = null;
$line = null;
$count = 0;
while (($line = fgets($handle, $maxLineLength)) !== false) {
$count++;
// P(1/$count) probability of picking current line as random line
if(rand() % $count == 0) {
$random_line = $line;
}
}
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
fclose($handle);
return null;
} else {
fclose($handle);
}
return $random_line;
}
}
// usage
echo rand_line("myfile.txt");
?>
Run Code Online (Sandbox Code Playgroud)
假设文件有10行,选择X行的概率是:
11/2 * P(1)2/3 * P(2)(N-1)/N * P(N-1)=1/N这将最终从任意大小的文件中为我们提供均匀分布的随机行,而无需将整个文件实际读入内存.
我希望它会有所帮助.
对这种情况采取的一般方法是:
file()echo 使用随机数组值 array_rand()
您的代码可能如下所示:
$lines = file('my_file.txt');
echo $lines[array_rand($lines)];
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10986 次 |
| 最近记录: |