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

C 語言偽隨機數生成算法原理與自定義實現

     編輯:關於C語言

偽隨機數本質

計算機無法產生真隨機數,通過**確定性算法**生成看似隨機的序列。核心公式:X_{n+1} = (a * X_n + c) mod m(線性同餘法,LCG)。

自定義實現(參考 curl/內核風格)

#include <stdio.h>
#include <time.h>

static unsigned int randseed;

unsigned int Curl_rand(void) {
    randseed = randseed * 1103515245 + 12345; // 經典 LCG 參數
    return (randseed << 16) | ((randseed >> 16) & 0xFFFF); // 打亂高低位
}

void Curl_srand(void) {
    randseed = (unsigned int)time(NULL);
    Curl_rand(); Curl_rand(); Curl_rand(); // 熱身
}

int main() {
    Curl_srand();
    for (int i = 0; i < 10; i++)
        printf("%u\n", Curl_rand() % 100); // 0-99
    return 0;
}

標準庫 rand/srand 用法

#include <stdlib.h>
#include <time.h>
int main() {
    srand(time(NULL));
    for (int i=0; i<10; i++) printf("%d\n", rand() % 100);
    return 0;
}

關鍵點對比

項目自定義 LCG標準 rand
可移植性完全可控,跨平台一致實現定義,不同庫結果不同
週期2^32(參數滿足 Hull-Dobell 定理)通常 2^31-1 或更大
線程安全全局種子非線程安全全局種子非線程安全
加密安全否(可預測)否

改進方向

  • 使用 thread_local 種子實現線程安全。
  • 採用 Mersenne Twister (MT19937) 獲得更長週期、更好統計特性。
  • 加密場景必須用 CSPRNG(如 /dev/urandom、CryptGenRandom、getrandom())。

總結

理解 LCG 原理有助於在無標準庫環境(嵌入式、內核、引導加載器)實現可控隨機數。應用層優先使用標準庫或成熟第三方庫(如 random C++11、PCG、xoshiro),避免自造輪子導致統計缺陷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved