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;
}
核心機制深度解析
| 函數 | 作用 | 關鍵點 |
| rand() | 返回 0~RAND_MAX 偽隨機整數 | 線性同餘算法,確定性序列 |
| srand(seed) | 設置隨機數種子 | 同種子 → 同序列;未調用默認 seed=1 |
| time(NULL) | 獲取當前時間戳 | 常用作種子來源,秒級精度 |
偽隨機數本質
- 非真隨機:由確定性遞推公式生成
- 周期性:序列長度有限(通常 2³² 或更長)
- 統計特性:大樣本下近似均勻分佈
- 可重現性:相同種子產生完全相同序列(利於調試)
關鍵避坑指南
- 不要在循環中重複調用 srand:同一秒內多次調用會導致相同種子,產生相同序列
- 範圍映射優先用浮點法:
rand() % n 會導致分佈不均(當 n 不能整除 RAND_MAX+1)
- 線程不安全:多線程環境下
rand() 存在數據競爭,需用 rand_r() 或線程局部存儲
- 加密場景禁用:偽隨機可預測,密鑰生成必須用密碼學安全隨機數生成器(CSPRNG)
現代替代方案對比
| 方案 | 適用場景 | 優點 | 缺點 |
| rand/srand | 簡單模擬、教學、非關鍵隨機 | 標準庫、零依賴、可移植 | 質量一般、非線程安全 |
| C++11 <random> | 科學計算、遊戲、生產級應用 | 多種引擎/分佈、線程安全、高質量 | 語法較繁瑣 |
| OS CSPRNG | 密鑰、Token、安全敏感場景 | 密碼學安全、不可預測 | 平台相關、速度較慢 |
總結:理解 srand(time(NULL)) + 浮點映射是 C 語言隨機數的正確打開方式;現代項目優先遷移至 C++11 <random>。
- 上一篇文章: 從點積定義推導點積公式:余弦定理幾何證明
- 下一篇文章: C++ 成員函數模板:實現智能指針隱式類型轉換
Copyright ©
程式碼之家 All Rights Reserved