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