我尝试从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
答案 0 :(得分:0)
为什么默认构造的随机设备不起作用?
可能与实现的质量有关,或者与执行环境有关,或者两者都有。标准肯定不能保证这种行为。
通常,人们可能不应该依赖std::random_device
的随机性。至少将其与另一个种子和/或伪随机数组合。