C语言实现文件内容按行随机排列的算法示例
本文实例讲述了C语言实现文件内容按行随机排列的算法。分享给大家供大家参考,具体如下:
在实际工作上有种需求,就是需要从给定的数据里,随机抽取一部分。
有一种简单的方法是根据总的数据条数和要抽取的数据条数,通过简单方法,隔几行取一个,这样也能达到随机抽取一部分的目的。
但这样,源数据是顺序的,则抽取的数据也是顺序的,不满足一些情境。
这里实现的功能是:将全部数据,按行重新随机排列,这样从结果头部选几行,就是随机抽取的几行了,比较方便。
实现的思路: 对于N行的数据,给每一行用[1-N]之间不重复的数做标记,最后按标记数排列即可。(不重复上要稍微费点儿心思)
实现思路比较重要,实现就简单了~
实现上用c结合shell的方式,下面为参考代码。
总控脚本:用不重复随机数做标记,然后按标记排序
#!/bin/sh ###note:shrandom.shin_fnameout_fname### infile=$1 outfile=$2 line_num=`cat$infile|wc-l` ./random$line_num$infile$outfile.tmp sort$outfile.tmp-k2-n-t''|cut-f1>$outfile
随机化的执行程序random的实现
//random.c #include#include #include #include usingnamespacestd; constintLEN=4098; //返回属于[p,q)的随机整数 intrand(intp,intq) { intsize=q-p+1; returnp+rand()%size; } //交换两个元素值 voidswap(int&a,int&b) { inttemp=a; a=b; b=temp; } //打印数组值 voidprint(int*v,intn) { for(inti=0;i 0;i--) { intr=rand(0,i+1); swap(v[r],v[i]); } } //删除换行符 intchomp(char*str) { intlen=strlen(str); while(len>0&&(str[len-1]=='\n'||str[len-1]=='\r')) { str[len-1]=0; len--; } returnlen; } //主函数 intmain(intargc,char*argv[]) { intline_num=atoi(argv[1]); printf("%u\n",line_num); int*value=(int*)malloc((line_num)*sizeof(int)); printf("%u\n",line_num); randomize(value,line_num); //print(value,N); FILE*infile=fopen(argv[2],"r"); if(infile==NULL) { printf("Cann'topenfile%s.",argv[1]); return0; } FILE*outfile=fopen(argv[3],"w"); if(outfile==NULL) { printf("Cann'topenfile%stowrite.",argv[2]); return0; } inti=0; charstr[LEN]; str[0]=0; str[LEN-1]=0; while(!feof(infile)) { if(!fgets(str,sizeof(str),infile)) { break; } str[LEN-1]=0; chomp(str); fprintf(outfile,"%s\t%u\n",str,value[i]); i++; } fclose(infile); fclose(outfile); return0; }
希望本文所述对大家C语言程序设计有所帮助。