Читать случайную строку из файла?C # - PullRequest
7 голосов
/ 19 сентября 2010

У меня есть текстовый файл с несколькими сотнями строк, структура довольно проста.

имя, фамилия

Мне нужно выбрать случайное имя и список из файла.

Ответы [ 2 ]

15 голосов
/ 19 сентября 2010
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];

Другой (и, возможно, лучший) вариант - в первой строке файла должно быть указано количество записей, а затем вам не нужно читать весь файл.

11 голосов
/ 19 сентября 2010

Прочитайте каждую строку, сохраняя количество 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 реализации для выбора узла из произвольно длинного связанного списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...