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

參考資料與資源