1. 有一个文件,如何在不知道有多少行的情况下读取该文件,从中随机选择并输出一行

当我们读取第 i (i  > 0) 行时,以 1 / i 的概率选择第 行,并替换掉原来选的行。
即总选择第一行,并以概率 1 / 2 选择第 2 行,以概率 1 / 3 选择第 行,依次类推。
到文件结束时,每个行被选中的概率都相等。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <time.h>
 5 #define MAX_LINE_LEN 4096
 6 int main()
 7 {
 8     srand(time(NULL));
 9     const char *filename = "input.txt";
10     FILE * file = fopen(filename, "r");
11     char line_buffer[MAX_LINE_LEN];
12     char selection[MAX_LINE_LEN];
13     int i = 1;
14     while(fgets(line_buffer, MAX_LINE_LEN, file))
15     {
16         if(rand()%i == 0)
17             strcpy(selection, line_buffer);
18         ++i;
19     }
20     puts(selection);
21     fclose(file);
22     return 0;
23 }
View Code

相关文章: