首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言隨機抽籤:兩班各抽 5 位學生參加教學評價(含亂數種子與去重邏輯)

     編輯:關於C語言

題目情境

賀老師教兩班 C++:
1 班學號 1~41、2 班學號 42~84。
每班需隨機抽 5 位不重複學生參加評價,寫程式完成抽籤。

原始碼問題

原始碼直接 rand() % 84 產生 10 個號碼,存在三大缺失:

  1. 未區分兩班,可能抽到對方班級學生
  2. 未去重,可能重複抽中同一位
  3. 未呼叫 srand(),每次執行結果相同

修正版完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void drawClass(int start, int end, const char* className) {
    int total = end - start + 1;
    int *pool = malloc(total * sizeof(int));
    for (int i = 0; i < total; i++) pool[i] = start + i;

    // Fisher-Yates 洗牌演算法
    for (int i = total - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        int tmp = pool[i]; pool[i] = pool[j]; pool[j] = tmp;
    }

    printf("%s 抽中學號:", className);
    for (int i = 0; i < 5; i++) printf("%d ", pool[i]);
    printf("\n");
    free(pool);
}

int main() {
    srand((unsigned)time(NULL));  // 以當前時間為種子

    drawClass(1, 41, "1 班");
    drawClass(42, 84, "2 班");
    return 0;
}

執行範例

程式執行畫面

1 班 抽中學號:7 23 5 39 12
2 班 抽中學號:56 78 45 62 83

關鍵技術點

  • srand(time(NULL)):確保每次執行結果不同
  • Fisher-Yates 洗牌:O(n) 時空均優,保證等機率不重複
  • 模組化函數:drawClass 可復用於任意區間抽樣

進階延伸

  1. 加權抽樣:平時成績高者機率較大
  2. 儲存抽籤紀錄,避免連續多次抽到同學
  3. GUI 版本:用 ncurses 或 Qt 做動畫抽籤效果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved