#include :rand()、srand()、RAND_MAX#include :time() 用於種子生成C/C++ 無 標準 random(int) 函數,常見為自定義宏。
void srand(unsigned int seed);
srand(1)int rand(void); // 返回 0 ~ RAND_MAX (通常 32767 或 2147483647)
srand((unsigned)time(NULL)); // 以當前秒數為種子
for (int i = 0; i < 10; i++)
printf("%d\n", rand() % 100); // 0-99
time(NULL) 返回自 1970-01-01 00:00:00 UTC 的秒數,每秒變化,確保種子不同。
// 錯誤示範
for (int i = 0; i < 10; i++) {
srand((unsigned)time(NULL)); // 若循環在 1 秒內完成,種子相同!
printf("%d\n", rand() % 100);
}
同一秒內 time(NULL) 返回值不變 → 種子相同 → 輸出完全相同的 10 個數。
鐵律:srand 全程只調用一次,通常在 main 開頭。
int rand_range(int min, int max) {
return min + rand() / (RAND_MAX / (max - min + 1) + 1);
}
避免 rand() % N 的模數偏差 (當 RAND_MAX 非 N 的倍數時,低數值概率略高)。
double rand_double() {
return (double)rand() / (RAND_MAX + 1.0);
}
標準 rand() 質質一般 (週期短、低位隨機性差、非線程安全)。嚴肅應用建議:
std::mt19937 (梅森旋轉)、std::uniform_int_distributiondrand48/erand48 (POSIX)、arc4random (BSD)、第三方庫 (PCG, xoshiro)/dev/urandom (Linux)、CryptGenRandom (Windows)、getrandom() (Linux 3.17+)#include#include #include #define RANDOM_RANGE(min, max) (min + rand() / (RAND_MAX / (max - min + 1) + 1)) int main() { srand((unsigned)time(NULL)); // 僅一次! printf("0-99: "); for (int i = 0; i < 10; i++) printf("%d ", RANDOM_RANGE(0, 99)); printf("\n"); printf("雙骰子: "); for (int i = 0; i < 5; i++) printf("%d ", RANDOM_RANGE(1,6) + RANDOM_RANGE(1,6)); printf("\n"); return 0; }