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

C 語言隨機數生成完整指南:srand、rand、time 機制詳解

     編輯:關於C語言

核心函數與頭文件

  • #include :rand()、srand()、RAND_MAX
  • #include :time() 用於種子生成

C/C++ 無 標準 random(int) 函數,常見為自定義宏。

雙函數協作機制

srand():設置種子

void srand(unsigned int seed);
  • 初始化偽隨機數生成器內部狀態
  • 相同 seed → 相同隨機序列 (確定性,利於調試/重現)
  • 未調用 srand 等價於 srand(1)

rand():生成隨機數

int rand(void);  // 返回 0 ~ RAND_MAX (通常 32767 或 2147483647)
  • 線性同餘法 (LCG) 等演算法生成偽隨機序列
  • 必須先調用 srand 設置種子,否則每次運行序列相同

關鍵模式:每次運行產生不同序列

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 的秒數,每秒變化,確保種子不同。

常見錯誤:srand 放入循環

// 錯誤示範
for (int i = 0; i < 10; i++) {
    srand((unsigned)time(NULL));  // 若循環在 1 秒內完成,種子相同!
    printf("%d\n", rand() % 100);
}

同一秒內 time(NULL) 返回值不變 → 種子相同 → 輸出完全相同的 10 個數。

鐵律:srand 全程只調用一次,通常在 main 開頭。

生成指定範圍隨機數的正確姿勢

整數範圍 [min, max]

int rand_range(int min, int max) {
    return min + rand() / (RAND_MAX / (max - min + 1) + 1);
}

避免 rand() % N 的模數偏差 (當 RAND_MAX 非 N 的倍數時,低數值概率略高)。

浮點數 [0.0, 1.0)

double rand_double() {
    return (double)rand() / (RAND_MAX + 1.0);
}

進階:更好的隨機數生成器

標準 rand() 質質一般 (週期短、低位隨機性差、非線程安全)。嚴肅應用建議:

  • C++11 :std::mt19937 (梅森旋轉)、std::uniform_int_distribution
  • C 語言:drand48/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;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved