#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;
}
<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) |
getpid()/clock() 微秒級種子。