簡體   English   中英

蘭德()真的那么糟糕嗎?

[英]Is rand() really that bad?

通用隨機數生成的啟發,我決定執行自己的測試,看看rand()出了什么問題。 使用這個程序:

srand(time(0));
for (int i = 0; i < 1000000; ++i)
{
    std::cout << rand() % 1000 << " ";
}

我使用命令在Octave中加載它:

S = load("test.txt")
hist(S)

得到了這個結果:

結果

對我來說,結果看起來非常均勻。 我預計結果會更加偏斜。 我的測試錯了嗎?

你問題中的測試並沒有真正測試隨機性。 它所做的就是確保數字均勻分布。 這是必要但不充分的條件:隨機數發生器有許多其他方法可能不足。

例如,如果我給你的函數在循環中返回數字0,1,2,...,999,它也會通過你的測試。 然而,任何合理的隨機性定義顯然都會失敗。

要了解隨機數生成器在實踐中的測試方法,請查看

有關rand()的討論,請查看rand() Considered Harmful

您沒有考慮的一個重點是生成的隨機序列是多么可預測。 當使用time()作為隨機種子時,如果攻擊者知道 - 或多或少 - 生成種子時,他可以很容易地重現整個隨機序列。

這就是為什么需要一個真正的隨機源,假設你使用這些隨機數來解決與安全相關的問題。

當安全性非常重要時,您還希望從真正的隨機源中獲取每個數字,而不依賴於PRNG。 更慢但更安全。

這取決於您的目的,所提供的rand()對於現有的使用而言是簡單的,具有可接受的分發可能性,它不是為加密目的而設計的,也不是物理模擬目的。 如果您想要一個加密級別或進行物理模擬,那么它不是一個好的選擇,您可能需要獲得特殊的實現。
計算機程序還沒有真正的隨機性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM