Прочитайте каждую строку, сохраняя количество N строк, которые вы видели до сих пор.Выберите каждую строку с вероятностью 1 / N, т. Е. Всегда будет выбрана первая строка, вторая строка будет выбрана 1/2 раза, чтобы заменить первую, третья 1/3 раза, ... Таким образом, каждая строка имеет1 / N вероятность быть выбранной строкой, вам нужно только прочитать файл один раз, и вам не нужно хранить весь файл в памяти в любой момент времени.
Вот реализация, которая может бытьадаптировано для ваших нужд.
public string RandomLine( StreamReader reader )
{
string chosen = null;
int numberSeen = 0;
var rng = new Random();
while ((string line = reader.ReadLine()) != null)
{
if (rng.NextInt(++numberSeen) == 0)
{
chosen = line;
}
}
return chosen;
}
На основе C реализации для выбора узла из произвольно длинного связанного списка.