將檔案內容按行隨機排列

2021-06-05 16:23:09 字數 1585 閱讀 6453

在實際工作上有種需求, 就是需要從給定的資料裡,隨機抽取一部分。

有一種簡單的方法是根據總的資料條數和要抽取的資料條數, 通過簡單方法,隔幾行取乙個,這樣也能達到隨機抽取一部分的目的。

但這樣,源資料是順序的,則抽取的資料也是順序的,不滿足一些情境。

這裡實現的功能是:將全部資料,按行重新隨機排列, 這樣從結果頭部選幾行,就是隨機抽取的幾行了,比較方便。

實現的思路:對於n行的資料, 給每一行用[1-n]之間不重複的數做標記, 最後按標記數排列即可。(不重複上要稍微費點兒心思)

實現思路比較重要,實現就簡單了~

實現上用c結合shell的方式,下面為參考**。

#總控指令碼:用不重複隨機數做標記,然後按標記排序

#!/bin/sh

### note: sh random.sh in_fname out_fname ###

infile=$1

outfile=$2

line_num=`cat $infile | wc -l `

./random $line_num $infile $outfile.tmp

sort $outfile.tmp -k 2 -n -t ' ' | cut -f1 > $outfile

#隨機化的執行程式random的實現

#include #include #include #include using namespace std;

const int len = 4098;

//返回屬於[p,q)的隨機整數

int rand(int p, int q)

//交換兩個元素值

void swap(int& a , int& b)

//列印陣列值

void print(int *v, int n)

}

//給陣列a[n], 隨機不重複賦值[1,n]之間的數

void randomize(int *v, int n)

for(int i=n-1; i>0; i--)

}//刪除換行符

int chomp(char *str)

return len;

}//主函式

int main(int argc, char *argv)

file* outfile = fopen(argv[3], "w");

if( outfile == null)

int i=0;

char str[len];

str[0] = 0;

str[len-1] = 0;

while( !feof(infile) )

str[len- 1] = 0;

chomp(str);

fprintf(outfile, "%s\t%u\n", str, value[i]);

i++;

}fclose(infile);

fclose(outfile);

return 0;

}

將檔案內容按行隨機排列

在實際工作上有種需求,就是需要從給定的資料裡,隨機抽取一部分。有一種簡單的方法是根據總的資料條數和要抽取的資料條數,通過簡單方法,隔幾行取乙個,這樣也能達到隨機抽取一部分的目的。但這樣,源資料是順序的,則抽取的資料也是順序的,不滿足一些情境。這裡實現的功能是 將全部資料,按行重新隨機排列,這樣從結果...

C語言實現檔案內容按行隨機排列的演算法示例

在實際工作上有種需求,就是需要從給定的資料裡,隨機抽取一部分。有一種簡單的方法是根據總的資料條數和要抽取的資料條數,通過簡單方法,隔幾行取乙個,這樣也能達到隨機抽取一部分的目的。但這樣,源資料是順序的,則抽取的資料也是順序的,不滿足一些情境。這裡實現的功能是 將全部資料,按行重新隨機排列,這樣從結果...

按行讀取檔案

const string strurlfilename testurl.txt ifstream fin strurlfilename.c str fstream binary if fin fin.eof string serverurl getline fin,serverurl info lo...