我正在尝试编写一个程序,从文本文件(包含50行)中选取3个随机行并将它们输出到屏幕上。
这是我目前的代码:
string line;
int random = 0;
int numOfLines = 0;
ifstream File("file.txt");
srand(time(0));
random = rand() % 50;
while(getline(File, line))
{
++numOfLines;
if(numOfLines == random)
{
cout << line;
}
}
我可以像上面那样打印一条随机线而不是三条随机线。
答案 0 :(得分:2)
你应该做什么取决于“随机”究竟是什么意思,你想要什么样的输出,以及你有什么输入。
例如,如果要选择任意三个不同的行,并且希望所有行都有相同的机会显示为任何输出行,并且如果您知道行数,则可以执行以下操作:
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;
}
(或者你可以将整个文件读入一个字符串向量,将该向量混合并直接选择前三个,而不是使用索引数组间接地执行此操作。)
如果你想选择三条随机线,并且你希望线条被选中两次或三次,那么你可以做一些像凯恩绥子的第二个例子。
另一个选项不依赖于知道行数:使用algorithm R进行油藏采样。通过这个,您可以读取文件,根据某个公式以概率选择线条。最后,您可以获得所需的行数并将其打印出来。 Example
答案 1 :(得分:1)
你得到一个新的随机数。这个方法需要3次循环文件。
int count = 1;
While(count <= 3)
{
random = rand() % 50;
while(getline(File, line))
{
++numOfLines;
if(numOfLines == random)
{
cout << line;
}
}
count++;
}
或者你得到三个随机数,然后只是循环开始
random = rand() % 50;
random1 = rand() % 50;
random2 = rand() % 50;
while(getline(File, line))
{
++numOfLines;
if(numOfLines == random || numOFLines == random1 || numOfLines == random2)
{
cout << line;
}
}
答案 2 :(得分:0)
#include <iostream>
#include <fstream>
#include <random>
#include <string>
#include <vector>
int randomNumber() { // Using C++11 random features
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> dist(0.0, 50.0);
return dist(mt);
}
int main()
{
std::ifstream file("file.txt");
std::vector<std::string> lines(50); // # of lines here (instead of using push_back)
while (file.is_open()) {
for (auto i = 0; i < lines.size(); ++i) {
std::getline(file, lines[i]);
}
file.close();
}
std::vector<int> rand_index(3); // # of random numbers here
for (auto i = 0; i < rand_index.size(); ++i) {
rand_index[i] = randomNumber();
}
}
答案 3 :(得分:0)
//first store the line numbers you want to read in array, you can do it as follow:
int linetoRead[3];
for(int i =0 ;i<3;i++)
{
linetoRead[i] = rand() % 50;
}
bool isKeep(int lineN)
{
for(int i =0 ;i<3;i++)
{
if(linetoRead[i] == lineN)
return true;
}
return false;
}
//then do the while loop as follows
int LineRead = 0;
int lineN = 0;
while(getline(File, line) && LineRead < 3)
{
if(isKeep(lineN))
{
// keep the line or display it
LineRead++;
cout << line;
}
lineN++;
}