C++ 標準庫(而非 .NET 語言)是 C++ 高效開發的基石,涵蓋容器、算法、迭代器、輸入輸出、數值計算等核心組件。本文從 rand() 偽隨機數生成原理切入,深入剖析標準庫設計哲學,並揭露經典教材誤導學習者的常見陷阱,助你建立正確學習路徑。
rand() 與 srand()rand() 產生的並非真隨機數,而是偽隨機數序列。其核心演算法為線性同餘生成器:
// 經典實現(C 語言標準庫典型實現)
static unsigned long next = 1;
int rand(void) {
next = next * 1103515245 + 12345; // 修改種子狀態
return (unsigned int)(next / 65536) % 32768; // 返回 0~32767 之間的偽隨機數
}
void srand(unsigned int seed) {
next = seed; // 設置初始種子
}
關鍵特性:
seed)產生的序列完全一致。srand(),rand() 默認種子為 1,導致每次程序運行產生相同序列。利用系統時間的唯一性與單調遞增特性:
#include <cstdlib>
#include <ctime>
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr))); // 設置種子
for (int i = 0; i < 5; ++i) {
std::cout << std::rand() << ' ';
}
return 0;
}
注意:std::time(nullptr) 精度為秒,同一秒內多次啟動程序種子相同。高頻場景建議結合 std::chrono::high_resolution_clock 或 /dev/urandom(Linux)獲取熵源。
<random> 頭文件C++11 引入 <random>,提供專業級隨機數設施,強烈建議棄用 rand()/srand():
#include <random>
#include <iostream>
int main() {
std::random_device rd; // 硬件熵源(非確定性)
std::mt19937 gen(rd()); // 梅森旋轉算法引擎(高質量、長週期)
std::uniform_int_distribution<> dis(1, 100); // 均勻分佈 1~100
for (int i = 0; i < 5; ++i)
std::cout << dis(gen) << ' '; // 生成隨機數
return 0;
}
優勢:分佈可控(均勻、正態、泊松等)、引擎可替換、線程安全、統計特性優異。
市面上大量《Effective C++》、《C++ Primer》、《C++ 陷阱與缺陷》類書籍,存在三大誤區:
std::vector/string、std::map/unordered_map、std::sort/find_if/transform 等高頻組合。vector 擴容機制、unordered_map 哈希桶佈局、shared_ptr 控制塊結構,有助於性能調優與避坑。C++ 標準庫是工業級開發的利器,rand() 只是冰山一角。拋棄過時教材的「語言律師」式鑽研,轉向現代 C++(C++11/14/17/20)最佳實踐,結合實際項目場景,才能真正發揮標準庫「零開銷抽象」的威力。