任务是从txt文件中读取一些随机行(奇数或偶数,我将指定它),并且用户只写绝对相同的,如果它是正确的(相同的)程序< ll ll print成功。问题是我不知道如何只读取奇数或偶数行#并且它也应该随机生成(如奇数或偶数)。感谢
答案 0 :(得分:1)
循环和忽略偶数项的常用方法是......
for( int i = 0; thing = get_thing(); i++ ) {
/* It's even, skip it */
if( abs(i % 2) == 0 )
continue;
...do stuff with thing...
}
abs(i % 2) == 0
检查偶数,abs(i % 2) == 1
检查奇数。如果您想选择其中一个,请使用int parity
和abs(i % 2) == parity
。
从文件中有效地选择随机行需要少量数学。您必须阅读该文件一次,因为无法知道行的开始和结束位置。
效率低下的算法会读取所有N行然后选择一行,可能消耗大量内存。更高效的算法只会存储每行开始的位置。两者都是O(n)内存(意味着内存使用量随着文件大小的增长而增长)。但是有一个O(1)内存算法,只需要存储一行。
每一行都有1 / N的机会被选中。高效算法在读入时将其应用于每一行,但 N是到目前为止读取的行数。在伪代码......
int num_lines = 0;
char *picked_line = NULL;
while( line = getline() ) {
num_lines++;
if( roll(num_lines) == num_lines ) {
picked_line = line;
}
}
因此第一行有1/1的机会被选中。第二行有1/2的机会被选中。第三个有1/3的机会,依此类推。
为什么这会增加每一行有1 / N的机会?好吧,让我们来看看从三个中选出的第一行。
你可以对第二行和第三行做同样的事情来向自己证明这是有效的。