1. 有一个文件,如何在不知道有多少行的情况下读取该文件,从中随机选择并输出一行
当我们读取第 i (i > 0) 行时,以 1 / i 的概率选择第 i 行,并替换掉原来选的行。
即总选择第一行,并以概率 1 / 2 选择第 2 行,以概率 1 / 3 选择第 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 }