計算機無法產生真隨機數,通過**確定性算法**生成看似隨機的序列。核心公式:X_{n+1} = (a * X_n + c) mod m(線性同餘法,LCG)。
#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 種子實現線程安全。/dev/urandom、CryptGenRandom、getrandom())。理解 LCG 原理有助於在無標準庫環境(嵌入式、內核、引導加載器)實現可控隨機數。應用層優先使用標準庫或成熟第三方庫(如 random C++11、PCG、xoshiro),避免自造輪子導致統計缺陷。