文件中随机读取行问题
来源:互联网 发布:js每四张图片轮播代码 编辑:程序博客网 时间:2024/04/29 04:28
1. 有一个文件,如何在不知道有多少行的情况下读取该文件,从中随机选择并输出一行
当我们读取第 i (i > 0) 行时,以 1 / i 的概率选择第 i 行,并替换掉原来选的行。
即总选择第一行,并以概率 1 / 2 选择第 2 行,以概率 1 / 3 选择第3 行,依次类推。
到文件结束时,每个行被选中的概率都相等。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define MAX_LINE_LEN 4096int main(){srand(time(NULL));const char *filename = "input.txt";FILE * file = fopen(filename, "r");char line_buffer[MAX_LINE_LEN];char selection[MAX_LINE_LEN];int i = 1;while(fgets(line_buffer, MAX_LINE_LEN, file)){if(rand()%i == 0)strcpy(selection, line_buffer);++i;}puts(selection);fclose(file);return 0;}简单推一下。
到 1 行时,没问题,跳过。
到第 2 行时,第 2 行被选中的概率是1 / 2,那第 1 行被选中的概率也是 1 / 2 。
到第 3 行时,第 3 行被选中的概率是 1 / 3,第 1 行和第 2 行被选中的概率是 (1 / 2) * (2 / 3),依次递推。
到第 i 行时,第 1 ~ i 行每行被选中的概率都是 1 / i ,到文件最后一行也是这样。
2. 有一个文件,如何在不知道有多少行的情况下读取该文件,从中随机选择并输出k行(假设保证k小于文件总行数)
先读入第 1 ~ k 行保存,以后每次读入第 i 行,都以 k / i 的概率把刚读入的一行随机替换之前保存的 k 行中的一行。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#define MAX_LINE_LEN 4096int main(){int k = 5;srand(time(NULL));char line_buffer[MAX_LINE_LEN];char **selections = (char **)malloc(k*sizeof(char*));for(int i = 0; i < k; ++i)selections[i] = (char *)malloc(MAX_LINE_LEN*sizeof(char));const char *filename = "input.txt";FILE * file = fopen(filename, "r");// 先读取 1 ~ k 行for(int i = 0; i < k; ++i)fgets(selections[i], MAX_LINE_LEN, file);int i = k+1;while(fgets(line_buffer, MAX_LINE_LEN, file)){if(rand()%i < k) {// 随机替换已有的某一行int j = rand()%k;strcpy(selections[j], line_buffer);}++i;}for(int i = 0; i < k; ++i)puts(selections[i]);fclose(file);for(int i = 0; i < k; ++i)free(selections[i]);free(selections);return 0;}简单推一下。
设 1 ~ i ( i >= k ) 行每行被选中的概率都为 k / i ,当我们读取第i + 1 行时,以 k / (i+1) 的概率保留该行,并随机替换已保存的某一行(已保存的每行被替换掉的概率是1 / k )。这样,第 i + 1 行被选取的概率是 k / (i + 1),其他行被选取的概率为
(k / i ) * (1 - k / ( i + 1 ) ) + ( k / i) * (k / ( i + 1 )) * ( 1 - 1 / k ),
前面的是第 i + 1 行不被保留时的情况,后面的是第 i+1 行保留并把该行替换掉的情况,最终结果也是 k / ( i + 1 ),所以到第i + 1 行为止,每行被选取的概率仍然都相同。到文件结尾同样满足。
- 文件中随机读取行问题
- 随机行读取文件
- 随机读取文件中一行数据
- 随机读取文件的某一行
- 随机读取txt文件某一行
- 随机读取文件的某些行
- 随机读取txt文件的某一行
- 读取随机文件
- java随机读取文件
- Python随机读取文件
- shell读取文件 随机读取
- python 打开一个文件并随机读取文件某一行
- 随机文件读取流RandomAccessFile
- Java RandomAccessFile随机读取文件
- io文件操作(多种读取方式-字节,字符,行,随机)
- PHP随机读取大文件中的若干行
- python随机读取文件中的某一行内容
- SqlServer中随机读取记录
- New device resource allocate function
- 今天,我依然奋战在二级C
- Linux平台下基于BitTorrent应用层协议的下载软件开发--种子文件解析模块(parse_metafile.h)
- linux pm runtime
- 太有意死了
- 文件中随机读取行问题
- 程辉:谈工程师的价值和发展
- linux 目录结构
- Linux平台下基于BitTorrent应用层协议的下载软件开发--peer模块(peer.c)
- linux 刚创建一个空文件时快速扩展文件的大小
- n个数的最小公倍数
- 一些pythonic的代码
- python中星号
- Linux平台下基于BitTorrent应用层协议的下载软件开发--peer模块(peer.h)