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.
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.
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.
+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 :)
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.
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.
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?
@Itay: Nur wenn Sie den Kommentaren glauben: Das tue ich nicht. Aber ich habe mich schon einmal von der Wahrscheinlichkeit täuschen lassen.
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.
0 Stimmen
Posten Sie bitte, was Sie jetzt haben...