基本用法
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(void) {
int m, n;
time_t t;
srand((unsigned) time(&t)); // 以當前時間為種子初始化
m = rand(); // 0 ~ RAND_MAX (通常 32767 或 2^31-1)
n = rand() % 10; // 0 ~ 9
printf("m = %d\nn = %d\n", m, n);
return 0;
}
關鍵函數解析
| 函數 | 原型 | 說明 |
time() | time_t time(time_t *timer) | 返回自 1970-01-01 00:00:00 UTC 至今的秒數,常用作種子來源。 |
srand() | void srand(unsigned seed) | 設定隨機數生成器種子。相同種子產生相同序列。程式啟動時只需呼叫一次。 |
rand() | int rand(void) | 返回 0 到 RAND_MAX 之間的偽隨機整數。 |
常見種子來源
srand((unsigned) time(NULL)):最常用,無需額外變數。
srand((unsigned) getpid()):進程 ID 作為種子,同一程式多次執行種子固定,適合可重現測試。
- 高精度時間(如
clock_gettime)或硬體隨機源(/dev/urandom、RDRAND 指令)用於安全敏感場景。
生成指定範圍隨機數
// [min, max] 閉區間
int rand_range(int min, int max) {
return min + rand() % (max - min + 1);
}
// [0.0, 1.0) 浮點數
double rand_double() {
return (double)rand() / (RAND_MAX + 1.0);
}
注意事項
- 不要在迴圈中重複呼叫
srand(),否則若時間未變,產生相同序列。
rand() 線性同餘法統計特性較弱,嚴禁用於加密、安全、科學計算。需高品質隨機數請使用 C++11 <random> 或作業系統提供的 CSPRNG。
- 多執行緒環境下
rand() 非執行緒安全,建議使用 thread_local 引擎或 rand_r()(POSIX)。