[英]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.