簡體   English   中英

有沒有辦法檢查std :: random_device是否實際上是隨機的?

[英]Is there a way to check if std::random_device is in fact random?

引用cppreference

std :: random_device是一個非確定性隨機數引擎,但如果不支持非確定性隨機數生成,則允許實現使用偽隨機數引擎實現std :: random_device。

有沒有辦法檢查當前實現是否使用PRNG而不是RNG(然后說出錯並退出),如果沒有,為什么不呢?

請注意,一點點谷歌搜索顯示至少MinGW以這種方式實現了std::random_device ,因此如果要使用std::random_device ,這是真正的危險。

- -編輯 - -
此外,如果答案是否定的,有人可以給一些見解,為什么沒有這樣的功能/特征/ 東西,我會很感興趣。

有沒有辦法檢查當前實現是否使用PRNG而不是RNG(然后說出錯並退出),如果沒有,為什么不呢?

有一種方法:如果std::random_device::entropy是用隨機數引擎實現的(即,它是確定性的),它將返回0.0

從標准:

 double entropy() const noexcept; 

返回:如果實現使用隨機數引擎,則返回0.0 否則,返回operator()返回的隨機數的熵估計,范圍為min()log_2(max() + 1)

沒有100%安全的方法來確定真正的隨機性。 使用黑盒方法,您可以做的最好的事情是顯示證據,如果它不是完全隨機的:

  • 首先,您可以通過生成大量隨機的munmbers並對其分布進行統計來驗證分布似乎是隨機的(例如,生成0到1000之間的100萬個隨機數)。 如果看起來某些數字比其他數字顯得更頻繁,那么顯然它並不是隨機的。

  • 接下來你可以運行幾次在同一個初始種子之后生成隨機數的程序。 如果你獲得相同的隨機數序列,那么它肯定是PRNG而不是真正的randmness。 但是,如果你沒有獲得相同的序列,它就不會產生任何結果:庫可以使用某種自動種子(使用時鍾滴答或其他東西)來隱藏/改善偽隨機性。

  • 如果您的應用程序高度依賴於隨機性質量(例如加密質量),您應該考慮更多測試,例如NIST SP 800-22推薦的測試

暫無
暫無

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

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