Как вывести 30 случайных строк из тектового файла без нагрузки для сервера?

Файл txt - текстовой файл из 10тыс строк русскоязычного текста. Как вывести 30 случайных строк из этого файла без перемешивания? Код ниже выполнял эту функцию, каждый раз перемешивая файл, что затрудняло процесс и страница грузилась долго, учитывая несколько мест ввода скрипта на странице. Текст кириллица.

Формат вывода: случайная строка случайная строка ... случайная строка (всего 30)

Код, который использовался ранее (не подходит из-за длительности обращений к серверу):

<?php
$arr = file('https://site/1.txt');
shuffle($arr);
$res = array_slice($arr, 0, 30);
foreach ($res as $str) {
  $get  = mb_detect_encoding($str, array('utf-8', 'cp1251'));
  echo iconv($get, 'UTF-8', $str);
}
?>

или так:

foreach($res as $str){
  echo htmlspecialchars($str);
}
?>

Очень прошу предложить полный код решения, я сам SEOшник и в ПХП не силен. Заранее спасибо.


Ответы (1 шт):

Автор решения: MBo

По сути проблемы вам подойдёт алгоритм Reservoir sampling

*
  S has items to sample, R will contain the result
*/
ReservoirSample(S[1..n], R[1..k])
  // fill the reservoir array
  for i = 1 to k
      R[i] := S[i]

  // replace elements with gradually decreasing probability
  for i = k+1 to n
    j := random(1, i)   // important: inclusive range
    if j <= k
        R[j] := S[i]

Однако не могу сказать, подойдёт ли это вам, т.к. если файл изменяется, то весь файл всё равно читать нужно.

→ Ссылка