首頁 >後端開發 >C++ >為什麼 C 中的 `` 庫比 `rand()` 更受歡迎?

為什麼 C 中的 `` 庫比 `rand()` 更受歡迎?

DDD
DDD原創
2024-11-03 17:00:03185瀏覽

Why is the `` library in C   preferred over `rand()`?

為什麼新的隨機庫比 rand() 更好?

當代關於 rand() 的擔憂引發了關於利用高級隨機數的討論基於引擎分佈範式的生成(RNG)過程,而不是傳統的 std::rand() 和模方法。為了第一手了解 rand() 的缺點,進行了快速實驗。

利用 std::rand() 和 std 建立了兩個函數 getRandNum_Old() 和 getRandNum_New(): :mt19937 和 std::uniform_int_distribution 分別產生 0 到 5 之間的隨機數。使用每種方法產生 960,000 個隨機數,並記錄每個數字(0-5)的頻率。標準差作為衡量標準,數值越低表示分佈越均勻。該過程重複了 1000 次,並測量了每次迭代所需的時間。

令人驚訝的是,兩種方法中的捲數分佈相似。新方法大約慢了 4 倍。速度的提升似乎是以品質的最小提高為代價的。

然而,一個關鍵的區別在於 RNG 實作本身。許多 rand() 實作都採用線性同餘產生器 (LCG),但它們通常不是最強大的。儘管它們很流行,但它們通常在進行的基本測試中產生可接受的結果。

低於標準的 rand() 實現的缺點包括低位隨機性低、週期短、RAND_MAX 低以及連續序列之間的相關性萃取物。然而,值得注意的是,這些限制並不是 rand() API 固有的。

rand() 的根本問題集中在:

  1. 向後相容性:更改現有實作會破壞依賴於具有固定種子的srand 的程序的可重複性。
  2. 簡單介面:rand() 提供單一全域產生器。雖然適用於基本用例,但它在多執行緒應用程式和需要可重現序列的場景中提出了挑戰。

新的函式庫透過提供以下功能解決了這些問題:

  • 指定實作:交叉編譯器可重現的輸出和保證的特性。
  • 最先進的生成器:封裝在類別中以避免全域狀態問題。
  • 隨機設備:播種設施。

效能方面,std::mt19937(在測試中由 std::rand() 使用)比 std::minstd_rand 慢( 庫中也提供了 LCG)。使用 std::minstd_rand 以及與 getRandNum_Old() 類似的實作可以實現更快的執行速度(6 毫秒,而 rand() 為 8.61 毫秒)。

以上是為什麼 C 中的 `` 庫比 `rand()` 更受歡迎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn