C++ 隨機數產生器
通過交互式程式碼範例學習如何在 C++ 中產生隨機數。探索 rand()、srand()、<random> 庫、std::uniform_int_distribution 和 std::mt19937 的詳細用法。
需要快速產生隨機數?
試試我們的在線隨機數產生器,無需編寫程式碼即可獲得即時結果。
C++ 程式碼編輯器
通過交互式程式碼範例學習如何在 C++ 中產生隨機數。探索 rand()、srand()、<random> 庫、std::uniform_int_distribution 和 std::mt19937 的詳細用法。
輸出
模擬輸出(C++ 在伺服器上執行)
點擊"執行程式碼"查看範例輸出
經典 C++ 使用 rand()
使用 <cstdlib> 中傳統的 rand() 函式產生隨機整數。簡單且廣泛支援,但由於隨機性品質較差,不適合加密應用。
理解 C++ 隨機數產生
C++ 提供了多種產生隨機數的方法,從 C 語言中簡單的 rand() 函式演進到 C++11 中現代的 <random> 庫。經典的 rand() 使用線性同余產生器(LCG),並使用 srand() 進行種子初始化,而現代方法使用梅森旋轉演演演演算法並提供各種分布類用於不同用例。
rand() Function
<cstdlib> 中經典的 rand() 函式提供簡單的偽隨機數產生。使用 srand() 進行種子初始化,它使用線性同余產生器(LCG)演演演演算法。適合基本應用但不適合加密用途。
<random> Library
<random> 庫(C++11+)提供現代隨機數產生,包括 std::mt19937(梅森旋轉演演演演算法)、各種分布(如 uniform_int_distribution),以及比 rand() 更好的隨機性品質。
uniform_int_distribution
std::uniform_int_distribution 提供對整數範圍的精確控制和均勻分布。非常適合統計應用、模擬以及需要精確範圍控制的場景。
std::mt19937
std::mt19937 實現梅森旋轉演演演演算法,提供出色的統計特性和非常長的週期(2^19937-1)。它是大多數 <random> 分布的預設引擎。
常見用例
遊戲和模擬
在遊戲循環和模擬中使用 rand() 或現代 <random> 庫產生隨機骰子擲骰、抽卡、程式化產生和遊戲事件。
安全和加密
對於安全應用,考慮使用專門的加密庫。標準的 rand() 不是加密安全的。使用特定平臺的安全隨機數產生器產生密碼和令牌。
高性能計算
現代 <random> 庫配合 std::mt19937 在高性能計算和科學計算應用中產生大量隨機數時提供出色的性能。
軟體測試
建立隨機測試資料、模糊測試輸入和邊緣情況,確保 C++ 應用的健壯程式碼覆蓋和錯誤檢測。
C++ 隨機數產生如何工作
C++ 經典的 rand() 函式(來自 next = (a * current + c) % m 產生偽隨機數。序列是確定性的,必須使用 srand() 進行種子初始化。
現代的 庫(C++11+)使用梅森旋轉演演演演算法(std::mt19937),提供更好的隨機性品質和統計特性。它還提供各種分布類,如 uniform_int_distribution、normal_distribution 和 bernoulli_distribution 用於不同用例。
std::random_device 提供特定平臺的熵源,用於為隨機數引擎種子初始化,確保每次程式執行時產生不同的序列。
C++ 隨機數產生專家技巧
新程式碼避免使用 rand()
對於新的 C++ 程式碼(C++11 及更高版本),優先使用
始終為 srand() 設定種子
如果使用 rand(),始終在程式開始時調用 srand(std::time(0)) 為產生器設定種子。否則,每次都會得到相同的序列。使用
使用適當的分布
對於均勻整數範圍,使用 std::uniform_int_distribution。對於浮點數,使用 std::uniform_real_distribution。這確保了正確的統計特性。
技術規範
演演演演算法
- 線性同余產生器(rand 函式)
- 梅森旋轉演演演演算法(std::mt19937)
- 特定平臺熵源(std::random_device)
性能特徵
- rand():快但隨機性品質差
- <random>:快且品質優秀
- std::mt19937:產生大量時非常快