C++ 隨機數產生器
通過交互式程式碼範例學習如何在 C++ 中產生隨機數。探索 rand()、srand()、<random> 庫、std::uniform_int_distribution 和 std::mt19937 的詳細用法。
C++ 程式碼編輯器
通過交互式程式碼範例學習如何在 C++ 中產生隨機數。探索 rand()、srand()、<random> 庫、std::uniform_int_distribution 和 std::mt19937 的詳細用法。
#include <iostream>
#include <random>
int main() {
int min = 1;
int max = 100;
int quantity = 5;
// Modern C++ random number generation
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(min, max);
std::cout << "Modern C++ random numbers:" << std::endl;
for (int i = 0; i < quantity; i++) {
int num = dis(gen);
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
輸出
這是瀏覽器預覽,不會執行 Java 或 C++;預覽值不適合密碼學用途。
預覽範例
經典 C++ 使用 rand()
使用 <cstdlib> 中傳統的 rand() 函式產生隨機整數。簡單且廣泛支援,但由於隨機性品質較差,不適合加密應用。
需要快速產生隨機數?
試試我們的在線隨機數產生器,無需編寫程式碼即可獲得即時結果。
理解 C++ 隨機數產生
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
rand() Function
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
<random> Library
<random> 庫(C++11+)提供現代隨機數產生,包括 std::mt19937(梅森旋轉演演演演算法)、各種分布(如 uniform_int_distribution),以及比 rand() 更好的隨機性品質。
uniform_int_distribution
std::uniform_int_distribution 提供對整數範圍的精確控制和均勻分布。非常適合統計應用、模擬以及需要精確範圍控制的場景。
std::mt19937
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
常見用例
遊戲和模擬
在遊戲循環和模擬中使用 rand() 或現代 <random> 庫產生隨機骰子擲骰、抽卡、程式化產生和遊戲事件。
安全和加密
rand() 和 std::mt19937 不適合密碼學用途。安全敏感情境應使用有明確文件的密碼學函式庫或作業系統介面;std::random_device 不是跨平台的安全保證。
高性能計算
現代 <random> 庫配合 std::mt19937 在高性能計算和科學計算應用中產生大量隨機數時提供出色的性能。
軟體測試
建立隨機測試資料、模糊測試輸入和邊緣情況,確保 C++ 應用的健壯程式碼覆蓋和錯誤檢測。
C++ 隨機數產生如何工作
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
std::random_device 依賴具體實作,也可能使用確定性引擎,不能保證每個平台的輸出都無法預測。
實用建議
新程式碼避免使用 rand()
rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
明確選擇種子
固定種子會重現同一引擎序列。C++ 引擎不會自動從系統熵初始化;需要時應明確選擇種子。
使用適當的分布
對於均勻整數範圍,使用 std::uniform_int_distribution。對於浮點數,使用 std::uniform_real_distribution。這確保了正確的統計特性。
技術規範
演演演演算法
- rand() 的演算法由實作決定。C++11 隨機函式庫把 std::mt19937 等引擎與分布分開;分布並沒有預設的 mt19937 引擎。
- 梅森旋轉演演演演算法(std::mt19937)
- std::random_device 依賴具體實作,也可能使用確定性引擎,不能保證每個平台的輸出都無法預測。
性能特徵
- rand():快但隨機性品質差
- <random>:快且品質優秀
- std::mt19937:產生大量時非常快
常見問題
涵盖了哪些 C++ 方法?
經典 rand() 與 srand()、現代 <random> 函式庫、std::uniform_int_distribution 和 mt19937 引擎。
我可以自訂範例嗎?
可以。在參數面板中設定最小值、最大值和數量,然後運行以查看輸出。
今天推薦哪一種方法?
帶有指定發行版和引擎的 <random> 函式庫; rand() 在舊程式碼中仍然存在,但品質和範圍缺陷較弱。
如何提供生成器種子?
std::random_device 依賴具體實作,也可能使用確定性引擎,不能保證每個平台的輸出都無法預測。
rand() 在 C++ 中回傳的範圍是多少?
rand() 傳回 0 至 RAND_MAX,包含兩端。請核對平台:Microsoft CRT 的上限是 32767,其他實作不一定相同。
rand() 具備密碼學安全性嗎?
rand() 和 std::mt19937 不適合密碼學用途。安全敏感情境應使用有明確文件的密碼學函式庫或作業系統介面;std::random_device 不是跨平台的安全保證。
如何在 C++ 中產生隨機浮點數?
將 std::mt19937 與設定好區間的 std::uniform_real_distribution 結合使用,例如 0.0 到 1.0,然後呼叫 dist(generator)。結果是一個 double,包含下界但不包含上界。
rand() 在 C++ 中是執行緒安全的嗎?
rand() 的執行緒安全性取決於實作。每個執行緒使用獨立引擎,或同步存取共用引擎。
C++ standard draft: rand / srand · C++ standard draft: random_device · C++ standard draft: uniform_int_distribution
參考資料與資源
-
C++ <random> Reference - cppreference
C++ 官方的偽亂數產生函式庫參考文件。
-
Mersenne Twister - Wikipedia
大多數程式語言亂數函式庫背後的 Mersenne Twister 演算法。