簡體   English   中英

默認構造的 std::random_device 不返回隨機數

[英]Default constructed std::random_device doesn't return random number

我試圖從cppreference中運行一個關於std::random_device的簡單示例,但是在與 function 一致的情況下,調用d(rd1)程序進入無限循環並且永遠不會返回。

這是代碼:

#include <iostream>
#include <random>
 
int main()
{
 
    std::uniform_int_distribution<int> d(0, 10);
 
    std::random_device rd1;
    for(int n = 0; n < 10; ++n)
        std::cout << d(rd1) << ' ';
    std::cout << '\n';
}

經過一些檢查,我發現 function std::random_device::operator()總是返回值 4294967295 ,這導致std::uniform_int_distribution<IntType>::operator()進入無限循環。

如果我用"rdrand""/dev/urandom"程序顯式調用構造函數效果很好,但使用"rdseed"它是相同的錯誤結果。 此外,如果我鏈接到 llvm 的 libc++,則該示例可以正常工作。 值得注意的是,在 Ubuntu 16 和 18 上運行良好,但在 Ubuntu 20 和 Linux 上,我遇到了問題

為什么默認構造的隨機設備不起作用?

unname uname -a output:

Linux my-pc 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

以及有關系統的更多信息: lscpulshw

為什么默認構造的隨機設備不起作用?

可能與實施質量有關,或與執行環境有關,或兩者兼而有之。 標准當然不能保證這種行為。

一般來說,一個人可能不應該依賴std::random_device的隨機性。 至少,將它與另一個種子和/或偽隨機數結合起來。

暫無
暫無

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

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