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

C語言生成隨機學號:srand/rand 正確用法與均勻分布技巧

     編輯:C 語言問答

標準隨機數流程


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

int main() {
    // 1. 種子:僅程式啟動時調用一次
    srand((unsigned)time(NULL));

    // 2. 生成指定範圍 [min, max] 的均勻隨機整數
    int min = 20240001, max = 20249999;  // 例:2024級 4位流水號
    int range = max - min + 1;

    for (int i = 0; i < 10; i++) {
        // 方法:rand() % range + min  (範圍較小時可接受)
        int id = rand() % range + min;
        printf("%d\n", id);
    }
    return 0;
}

模數偏差問題與解決

rand() % n 當 RAND_MAX 不能被 n 整除時,低數值概率略高。


// 無偏差拒絕採樣
int rand_range(int min, int max) {
    int range = max - min + 1;
    int limit = RAND_MAX - (RAND_MAX % range);
    int r;
    do {
        r = rand();
    } while (r >= limit);
    return min + r % range;
}

現代 C (C11) <random.h> (若編譯器支援)


// 僅示意,實際 C11 無 ,C++ 才有
// C 可用第三方庫: PCG, xoshiro256**, wyrand

學號格式化輸出


// 固定寬度補零
printf("%08d\n", id);  // 輸出 8 位,不足前補 0
// 或組合字串
char id_str[20];
snprintf(id_str, sizeof(id_str), "STU%06d", id);

種子選擇最佳實踐

場景種子來源代碼
一般模擬/遊戲時間srand(time(NULL))
可重現測試固定常數srand(12345)
高熵需求 (密碼學不適用)/dev/urandom / CryptGenRandom讀取系統熵池
多執行緒執行緒局部種子每緒程獨立 rand_r(&seed)

警示

  • rand() 非密碼學安全**,嚴禁用於金鑰生成、Session ID、加密隨機數。
  • **同一秒內多次運行** 若種子相同,序列完全相同 → 需結合 getpid()/clock() 微秒級種子。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved