随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏
本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比。
程序用一次遍历,实现带权随机选取。
算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+...+wi)
用该行替换上一轮被选中的行,直至读取文件结束。这样可以从数学上保证i行
被选中的概率为wi/(w1+w2+...+wn);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include <limits.h>
#define BUFSIZE 4096
char selected[BUFSIZE];
void randselect(FILE*fp);
void main(int argc,char* argv[])
{
srand(time(NULL));
FILE *fp;
if(argc!=1&&argc!=2)
{
fprintf(stderr,"Invalid argument number.");
exit(1);
}
if(argc==1)
fp=stdin;
else
{
if(NULL==(fp=fopen(argv[1],"r")))
{
fprintf(stderr,"cann't open %s\n",argv[1]);
exit(2);
}
}
randselect(fp);
printf("%s",selected);
fclose(fp);
exit(0);
} void randselect(FILE*fp)
{
char *line=NULL;
size_t size = 0;
long int len,sumlen=0;
while((len=getline(&line,&size,fp))!=-1)
{
long int prelen=sumlen;
sumlen+=len;
long int tmp=(long int)((double)rand() / RAND_MAX *LONG_MAX) ;//扩大随机数的范围
tmp%=sumlen;
if(tmp>=prelen) //以[prelen,sumlen-1]/[0,sumlen-1]的概率换入该行
strcpy(selected,line);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏的更多相关文章
- tac命令的实现                                                    分类:            linux             2014-06-02 00:08    344人阅读    评论(0)    收藏
		
此程序实现简化的linux中的tac命令.即对文件按行倒序输出. 首先将文件指针置于文件尾,从后向前移动指针, 将两个换行符'\n'间的内容作为一行输出. #include<stdio.h> ...
 - makefile基础实例讲解                                                    分类:            C/C++             2015-03-16 10:11    66人阅读    评论(0)    收藏
		
一.makefile简介 定义:makefile定义了软件开发过程中,项目工程编译链.接接的方法和规则. 产生:由IDE自动生成或者开发者手动书写. 作用:Unix(MAC OS.Solars)和Li ...
 - CocoaPods安装和使用教程                                                    分类:            ios技术             ios相关             2015-03-11 21:53    48人阅读    评论(0)    收藏
		
目录 CocoaPods是什么? 如何下载和安装CocoaPods? 如何使用CocoaPods? 场景1:利用CocoaPods,在项目中导入AFNetworking类库 场景2:如何正确编译运行一 ...
 - ETL概述                                                    分类:            H2_ORACLE             2013-08-23 10:36    344人阅读    评论(0)    收藏
		
转自:http://blog.csdn.net/leosoft/article/details/4279536 ETL,Extraction-Transformation-Loading的缩写,中文名 ...
 - 树莓派做AP发射wifi(RTL8188CUS芯片)                                                    分类:            shell             ubuntu             Raspberry Pi             2014-11-29 01:25    822人阅读    评论(0)    收藏
		
最近在做一个项目,需要用树莓派作为AP发射wifi,对比cubieboard,树莓派的配置容易得多,而且支持也更多. 较为官方的介绍配置为无线热点的文章莫过于这一篇<RPI-Wireless-H ...
 - 用Apache Ivy实现项目里的依赖管理                                                    分类:            C_OHTERS             2014-07-06 18:11    564人阅读    评论(0)    收藏
		
Apache Ivy是一个管理项目依赖的工具. 它与Maven Apache Maven 构建管理和项目管理工具已经吸引了 Java 开发人员的注意.Maven 引入了 JAR 文件公共存储库的概念 ...
 - 利用ssh传输文件                                                    分类:            服务器搭建             Raspberry Pi             2015-04-12 18:47    58人阅读    评论(0)    收藏
		
在linux下一般用scp这个命令来通过ssh传输文件. 1.从服务器上下载文件 scp username@servername:/path/filename /var/www/local_dir(本 ...
 - C/C++中const的用法                                                    分类:            C/C++             2015-07-05 00:43    85人阅读    评论(0)    收藏
		
const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结 ...
 - SQL SERVER将某一列字段中的某个值替换为其他的值                                                       分类:            MSSQL             2014-11-05 13:11    67人阅读    评论(0)    收藏
		
SQL SERVER将某一列字段中的某个值替换为其他的值 UPDATE 表名 SET 列名 = REPLACE(列名 ,'贷','袋') SQL SERVER"函数 replace 的参数 ...
 
随机推荐
- EJB学习(三)——java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to..
			
在上一篇博客介绍了怎样使用使用Eclipse+JBOSS创建第一个EJB项目,在这期间就遇到一个错误: Exception in thread "main" java.lang.C ...
 - Angular结构简单介绍
			
在当前项目目录下,使用Angular-CLI生成一个组件:heroes ng generate component heroes 主界面(也就是一个主模块+多个单模块,例如我们创建的heroes(单模 ...
 - vue自定义轮播图组件 swiper
			
1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...
 - Input系统—ANR原理分析(转)
			
一. 概述 当input事件处理得慢就会触发ANR,那ANR内部原理是什么,哪些场景会产生ANR呢. “工欲善其事必先利其器”,为了理解input ANR原理,前面几篇文章疏通了整个input框架的处 ...
 - linux之rsync远程数据同步备份
			
rsync服务是一种高效的远程数据备份的工具,该服务的port号为873, 是Liunx下的一种非独立服务.由xinetd超级服务管理,取代监听873port. 长处: 1.rsync能够利用ssh和 ...
 - C实现头插法和尾插法来构建单链表(不带头结点)
			
链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点. ...
 - 网易新闻client(高仿)
			
近期整理了下自己曾经做过的项目,决定分享出来.本篇所展示的是仿网易新闻client,服务端是在新浪SAE部署着的.所以大家下载后,可直接在手机上看到效果.接下来看效果图: watermark/2/te ...
 - 【bzoj4320】ShangHai2006 Homework
			
若Y小于等于sqrt(300000),暴力,对所有的插入的数都更新mn[i]. 若Y大于sqrt(300000),枚举kY,用并查集维护>=i的第一个数,这样只支持删除操作是O(1),然后倒着枚 ...
 - <input type=XXXXX>
			
选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text,这是我们见的最多也是使用最多的,比如登陆输入用户名,注册输入电话号码,电子邮件,家庭住址等等.当然这也是Input ...
 - scikit-learn(1)  第一个例子说明
			
第一个 scikit-learn例子 ................................................................................. ...