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

C 語言偽隨機數生成:MSDN 官方示例與核心機制解析

     編輯:關於C

C 語言偽隨機數生成:MSDN 官方示例與核心機制解析

本文基於 MSDN 官方文檔,解析 rand()/srand() 的標準用法、種子機制、範圍映射最佳實踐。

MSDN 官方標準示例

// crt_rand.c
#include 
#include 
#include 

int main(void) {
    int i;

    // 以當前時間為種子,確保每次運行序列不同
    srand((unsigned)time(NULL));

    // 顯示 10 個 0~RAND_MAX 隨機整數
    for (i = 0; i < 10; i++)
        printf(" %6d\n", rand());

    printf("\n");

    // 生成指定範圍 [0, 100] 的隨機數(推薦浮點映射法)
    {
        int RANGE_MIN = 0;
        int RANGE_MAX = 100;
        for (i = 0; i < 10; i++) {
            int rand100 = (int)(((double)rand() / (RAND_MAX + 1.0)) * RANGE_MAX + RANGE_MIN);
            printf(" %6d\n", rand100);
        }
    }
    return 0;
}

核心機制深度解析

偽隨機數本質

  • 非真隨機:由確定性遞推公式生成
  • 周期性:序列長度有限(通常 2³² 或更長)
  • 統計特性:大樣本下近似均勻分佈
  • 可重現性:相同種子產生完全相同序列(利於調試)

關鍵避坑指南

  1. 不要在循環中重複調用 srand:同一秒內多次調用會導致相同種子,產生相同序列
  2. 範圍映射優先用浮點法:rand() % n 會導致分佈不均(當 n 不能整除 RAND_MAX+1)
  3. 線程不安全:多線程環境下 rand() 存在數據競爭,需用 rand_r() 或線程局部存儲
  4. 加密場景禁用:偽隨機可預測,密鑰生成必須用密碼學安全隨機數生成器(CSPRNG)

現代替代方案對比

函數作用關鍵點
rand()返回 0~RAND_MAX 偽隨機整數線性同餘算法,確定性序列
srand(seed)設置隨機數種子同種子 → 同序列;未調用默認 seed=1
time(NULL)獲取當前時間戳常用作種子來源,秒級精度

總結:理解 srand(time(NULL)) + 浮點映射是 C 語言隨機數的正確打開方式;現代項目優先遷移至 C++11 <random>。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案適用場景優點缺點
rand/srand簡單模擬、教學、非關鍵隨機標準庫、零依賴、可移植質量一般、非線程安全
C++11 <random>科學計算、遊戲、生產級應用多種引擎/分佈、線程安全、高質量語法較繁瑣
OS CSPRNG密鑰、Token、安全敏感場景密碼學安全、不可預測平台相關、速度較慢