您需要根据“随机”所指的具体含义、您想要的输出类型以及输入内容来决定应该采取哪种方法。例如,如果您想要选择任意三行且所有行都有相等的机会成为输出行,同时您了解行数,那么可以采用以下方法:
int number_of_lines = 50;
std::vector<int> line_indices(number_of_lines);
std::iota(begin(line_indices), end(line_indices), 0);
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 eng(seed);
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;
}
实时示例
(或者您可以将整个文件读入字符串向量中,对该向量进行洗牌,并直接选择前三个,而不是间接使用索引数组。)
如果您想选择三行随机文本,并且希望每行有被选两次或三次的机会,则可以像KaiEn Suizai的第二个示例那样做。
另一个选择不依赖于知道行数:使用算法R进行水塘抽样。使用此方法,您可以通过某个公式的概率挑选出文件中的行。在最后,您将得到所需数量的行并将其打印出来。示例
if (numOfLines == random1 || numOfLines == random2 || numOfLines == random3)
。 - Martin York