1、簡介
1. 編程 samp.c,實現從 n個記錄中隨機抽取 m個記錄。
2、算法
1)function(n, m):
輸入:整數 n, m
輸出:data[m],每個元素隨機取值 0~n-1,且各各不同
輔助數組 mark[n]
2)for i = 0…n:
mark[i] = 0
3)重複,使得有 s中有 m個元素等於 1:
k = random() % n
mark[k] = 1
4) 將 s中元素爲 1者的下標記錄到 a中
5)如 n = 16, m = 4,
第2)步後:mark = {0,0,0,1, 1,0,0,0, 0,0,0,1, 0,0,0,1,0},
則第3)步後:data = {3, 4, 11, 15}。
3、代碼實現
#include <stdio.h>
#include <stdlib.h>
#define N 46 //數據個數
#define M 64 //數據長度
char data[N][M]; //存取文件讀取的數據
int mark[N]; //標記數組
//數據抽取數據函數
void fuction(int n, int m) {
int i, j, k, count;
for (i = 0; i < N; ++i) { //初始化標記數組
mark[i] = 0;
}
for (i = 0; i < m; ++i) {
k = random() % n; //產生m個隨機數
mark[k] = 1;
}
}
//輸出函數
void output() {
int i;
for (i = 0; i < N; ++i) {
if (mark[i] == 1) {
printf("%d: %s", i, data[i]);
}
}
}
//主函數
int main(int argc, char *argv[]) {
if (argc < 1)
return 0;
int n, m, i = 0;
n = atoi(argv[1]); //數據總數
m = atoi(argv[2]); //隨機抽取的個數
srand(time()); //使每一次都產生不同隨機序列
while (fgets(data[i], M, stdin) > 0) { //讀取數據
i++;
}
fuction(n, m);
output();
}
4、相關文件:Github