默认构造的std :: random_device不返回随机数

时间:2020-07-22 14:52:41

标签: c++ linux ubuntu-20.04

我尝试从cppreference开始一个关于// document.querySelector('.btn-hold').addEventListener('click', function() { if (gamePlaying) { scores[activePlayer] += roundScore; document.getElementById(`score-${activePlayer}`).textContent = scores[activePlayer]; let input = document.getElementById('scoreSet').value; let winningScore; if (input === number) { // This is that I'm dealing with winningScore = input; } else { document.getElementById('scoreSet').value = '100'; } if (scores[activePlayer] >= winningScore) { document.getElementById(`name-${activePlayer}`).textContent = 'WINNER!'; document.querySelector(`.player-${activePlayer}-panel`).classList.add('winner'); document.querySelector(`.player-${activePlayer}-panel`).classList.remove('active'); diceDOM.style.display = 'none'; gamePlaying = false; } else { nextPlayer(); } } }); 的简单示例,但是在调用函数std::random_device的那一行程序进入了无限循环,并且永不返回。

代码如下:

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'; } 始终返回值4294967295,这导致std::random_device::operator()进入无限循环。

如果我使用std::uniform_int_distribution<IntType>::operator()"rdrand"程序显式调用构造函数,则效果很好,但是使用"/dev/urandom"时,则结果相同。另外,如果我链接到llvm的libc ++,则示例可以正常工作。值得注意的是,在Ubuntu 16和18上运行良好,但是在Ubuntu 20以及Linux Mint 20上却遇到了这个问题。

为什么默认构造的随机设备不起作用?

"rdseed"输出:

uname -a

以及有关系统的更多信息:lscpulshw

1 个答案:

答案 0 :(得分:0)

为什么默认构造的随机设备不起作用?

可能与实现的质量有关,或者与执行环境有关,或者两者都有。标准肯定不能保证这种行为。

通常,人们可能不应该依赖std::random_device的随机性。至少将其与另一个种子和/或伪随机数组合。