Was Sie sollten davon abhängig machen, was genau meinen Sie mit ‚zufällig‘ und welche Art von Ausgabe, die Sie wollen und was Sie habe als Eingabe.
Wenn Sie beispielsweise drei verschiedene Zeilen auswählen möchten und alle Zeilen die gleiche Chance haben sollen, als eine der Ausgabezeilen zu erscheinen, und wenn Sie die Anzahl der Zeilen kennen, können Sie so etwas tun :
int number_of_lines = 50;
// a vector to hold all the indices: 0 to number_of_lines
std::vector<int> line_indices(number_of_lines);
std::iota(begin(line_indices), end(line_indices), 0); // init line_indices
// C++11 random library (should be preferred over rand()/srand())
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed);
// shuffle the line_indices:
std::shuffle(begin(line_indices), end(line_indices), eng);
int number_of_lines_to_select = 3;
assert(number_of_lines_to_select <= number_of_lines);
std::string line;
std::ifstream file("file.txt");
int line_number = 0;
while (std::getline(file, line)) {
for (int i = 0; i < number_of_lines_to_select; ++i) {
if (line_number == line_indices[i]) {
std::cout << line << '\n';
}
}
++line_number;
}
Live example
(Oder Sie könnten nur die gesamte Datei in einen Vektor von Strings lesen, dass Vektor mischen und die ersten drei direkt wählen, anstatt dies indirekt zu tun, eine Reihe von Indizes verwendet wird.)
Wenn Sie drei zufällige Linien auswählen möchten und möchten, dass Linien zweimal oder dreimal ausgewählt werden, können Sie etwas wie KaiEn Suizais zweites Beispiel tun.
Eine andere Option hängt nicht von der Anzahl der Linien ab: Reservoir-Probenahme mit algorithm R. Damit lesen Sie die Datei durch und selektieren Linien mit einer Wahrscheinlichkeit nach einer bestimmten Formel. Am Ende haben Sie die Anzahl der gewünschten Zeilen und Sie drucken sie aus.
Example
Sie können alle Linien in den Speicher (ein Array oder Vektor) lesen. Wählen Sie dann drei "zufällige" Zeilen aus dem Array/Vektor. –
Sie können am Anfang 3 Randomzahlen wählen (stellen Sie sicher, dass sie nicht gleich sind). Dann lautet dein Test: 'if (numOfLines == random1 || numOfLines == random2 || numOfLines == random3)' –
@Loki Astari Danke! Ich werde versuchen, herauszufinden, wie man die erste Option tatsächlich macht! Ich habe nicht einmal daran gedacht, es so zu machen. – user5991813