randomize() 和 random() 是 **Turbo C / Borland C** 等舊式編譯器的**非標準擴展函數**,**不屬於C標準庫**,現代編譯器(GCC、MSVC、Clang)均**不支持**。
| 函數 | 頭文件 | 作用 | 標準 |
|---|---|---|---|
srand(seed) | <stdlib.h> | 設置隨機數種子 | C89 |
rand() | <stdlib.h> | 生成偽隨機數 [0, RAND_MAX] | C89 |
time(NULL) | <time.h> | 獲取當前時間戳作為種子 | C89 |
rand() 產生的是**偽隨機數序列**,由確定性算法生成。若不調用 srand() 設置種子,默認種子為 1,**每次程序運行產生的序列完全相同**。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
// 1. 設置種子:僅在程序啟動時調用一次!
srand((unsigned int)time(NULL));
// 2. 生成隨機數
for (int i = 0; i < 10; i++) {
printf("%d ", rand());
}
printf("\n");
return 0;
}
| 需求 | 公式 | 示例:生成 1-100 |
|---|---|---|
| 整數 [0, N-1] | rand() % N | rand() % 100 → 0-99 |
| 整數 [a, b] | a + rand() % (b - a + 1) | 1 + rand() % 100 → 1-100 |
| 浮點數 [0.0, 1.0) | (double)rand() / RAND_MAX | (double)rand() / RAND_MAX |
| 浮點數 [a, b) | a + (b-a) * rand() / RAND_MAX | 1.0 + 99.0 * rand() / RAND_MAX |
<stdlib.h> 和 <time.h>time 未聲明,檢查頭文件拼寫randomize(),直接替換為 srand(time(NULL))<random.h> (部分編譯器支持)// 現代C++風格在C中不可用,但可手工實現更好算法
// 例如:Mersenne Twister (MT19937) 移植版
getrandom()、/dev/urandomBCryptGenRandom()、CryptGenRandom()libsodium 的 randombytes_buf()// 錯誤1:循環中重複調用 srand()
for(i=0; i<10; i++) {
srand(time(NULL)); // 同一秒內種子相同!
printf("%d ", rand());
}
// 錯誤2:未包含頭文件
rand(); // 隱式聲明警告,行為未定義
// 錯誤3:期望真隨機
// rand() 是偽隨機,不可用於加密、安全關鍵場景
randomize() 相當於 srand(time(NULL))random(n) 相當於 rand() % n#include <stdio.h>
#include <stdlib.h>
void test_seed(unsigned int seed) {
srand(seed);
printf("Seed %u: ", seed);
for(int i=0; i<5; i++) printf("%d ", rand());
printf("\n");
}
int main() {
test_seed(1); // 默認種子
test_seed(42); // 固定種子 → 固定序列
test_seed(100); // 另一固定種子
// 實際應用中只用 time(NULL) 作為種子
return 0;
}