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

C 語言 rand() 產生隨機數完整指南:srand、time、種子與範圍控制

     編輯:關於C

基本用法

#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);
}

注意事項

  1. 不要在迴圈中重複呼叫 srand(),否則若時間未變,產生相同序列。
  2. rand() 線性同餘法統計特性較弱,嚴禁用於加密、安全、科學計算。需高品質隨機數請使用 C++11 <random> 或作業系統提供的 CSPRNG。
  3. 多執行緒環境下 rand() 非執行緒安全,建議使用 thread_local 引擎或 rand_r()(POSIX)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved