Что вы должны сделать, зависит от того, что именно вы имеете в виду под «случайным» и какой выход вы хотите, и что вы есть как ввод.
Например, если вы хотите выбрать любые три разные строки, и вы хотите, чтобы все линии имели равную возможность появляться как любая из выходных строк, и если вы знаете количество строк, вы можете сделать что-то вроде этого :
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
(Или вы можете просто прочитать весь файл в вектор строк, перетасовать, что вектор и выбрать первые три непосредственно, вместо того, чтобы делать это косвенно, используя массив индексов.)
Если вы хотите выбрать три случайные строки и хотите, чтобы линии имели шанс быть выбранными дважды или три раза, вы можете сделать что-то наподобие второго примера KaiEn Suizai.
Другой вариант не зависит от количества строк: выборки резервуаров с algorithm R. С помощью этого вы читаете файл, выбирая строки, как вы видите их с вероятностью в соответствии с определенной формулой. В конце у вас есть количество строк, которые вы хотите, и распечатываете их. Example
Вы можете прочитать все строки в памяти (массив или вектор). Затем выберите три «случайных» строки из массива/вектора. –
Вы можете выбрать 3 номера рандома в начале (убедитесь, что они не совпадают). Тогда ваш тест: 'if (numOfLines == random1 || numOfLines == random2 || numOfLines == random3)' –
@Loki Astari Спасибо! Собираюсь выяснить, как сделать первый вариант на самом деле! Я даже не думал об этом. – user5991813