7 Stimmen

Zufällige Zeile aus einer Datei lesen? c#

Ich habe eine Textdatei mit einigen hundert Zeilen, die Struktur ist ziemlich einfach.

vorname nachname

Ich muss einen zufälligen Vornamen und Nachnamen aus der Datei auswählen.

0 Stimmen

Posten Sie bitte, was Sie jetzt haben...

15voto

Itay Karo Punkte 17380
string[] lines = File.ReadAllLines(...); //i hope that the file is not too big
Random rand = new Random();
return lines[rand.Next(lines.Length)];

Eine andere (und vielleicht bessere) Möglichkeit besteht darin, dass die erste Zeile der Datei die Anzahl der Datensätze enthält, so dass Sie nicht die gesamte Datei lesen müssen.

4 Stimmen

+1: Ich hasse es, wenn Leute die Fragen, die ich eigentlich beantworten kann, vor mir beantworten, vor allem, wenn sie genau denselben Code verwenden, den ich verwenden würde :)

0 Stimmen

Danke, ich habe es gerade herausgefunden. Aber Ihr Weg scheint besser.

0 Stimmen

Das funktioniert, solange die Datei relativ klein ist. Ich habe eine Alternative bereitgestellt, mit der Sie nicht die gesamte Datei im Speicher halten müssen.

13voto

tvanfosson Punkte 506878

Lesen Sie jede Zeile und notieren Sie die Anzahl der Zeilen, N, die Sie bisher gesehen haben. Wähle jede Zeile mit einer Wahrscheinlichkeit von 1/N aus, d.h. die erste Zeile wird immer ausgewählt, die zweite Zeile wird 1/2 mal ausgewählt, um die erste zu ersetzen, die dritte 1/3 mal, ... Auf diese Weise hat jede Zeile eine Wahrscheinlichkeit von 1/N, die ausgewählte Zeile zu sein, Sie müssen die Datei nur einmal lesen, und Sie müssen nicht die gesamte Datei zu einem bestimmten Zeitpunkt im Speicher ablegen.

Hier ist eine Implementierung, die an Ihre Bedürfnisse angepasst werden kann.

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;
}

Basierend auf einer C Durchführung zur Auswahl eines Knotens aus einer beliebig langen verknüpften Liste.

0 Stimmen

Die Rechnung sieht für mich falsch aus. Ist die Wahrscheinlichkeit, die 1. Zeile auszuwählen, nicht 1/n! wenn man am Ende angekommen ist?

0 Stimmen

Das Rechnen hier ist gut und schön :)

0 Stimmen

@Itay: Nur wenn Sie den Kommentaren glauben: Das tue ich nicht. Aber ich habe mich schon einmal von der Wahrscheinlichkeit täuschen lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X