隨機數-抽號

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章