C++ 是gcc';'std::random_device'的实现是否正确?

C++ 是gcc';'std::random_device'的实现是否正确?,c++,random-seed,C++,Random Seed,std::random_设备的功能对我来说似乎很奇怪。具体来说,第137行: 随机\u设备::结果\u类型 随机_设备::_M_getval() { #如果(已定义uuui386 uu124; 124;已定义uux86 64 uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu386 124;已定义uuux86 uuuuuuuuuuuuu 如果(!\M\u文件) 返回uux86_rdrand(); #恩迪夫 假设所有这些量都已定义。然后当我在std::random_设备实例上调用ca

std::random_设备的功能对我来说似乎很奇怪。具体来说,第137行:

随机\u设备::结果\u类型
随机_设备::_M_getval()
{
#如果(已定义uuui386 uu124; 124;已定义uux86 64 uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu386 124;已定义uuux86 uuuuuuuuuuuuu
如果(!\M\u文件)
返回uux86_rdrand();
#恩迪夫

假设所有这些量都已定义。然后当我在
std::random_设备
实例上调用call操作符时,我从
rdrand
指令中得到结果。但是
rdrand
没有实现随机设备;
rdrand
是一个伪随机数生成器,更接近(比如说)梅森扭曲比物理源或随机性

我本来希望在这里调用一个
rdseed
buildin/inquired,因为
rdseed
通过查询一个产生随机数的电路。这对我来说更像是一个“设备”


但是我对随机数的生成知之甚少;所以我对
std::random_设备的实现的思考过程是否不正确?为什么?

std::random_设备
可以退回到伪随机生成器
std::random_device
可以根据实现定义的伪随机数引擎来实现,如果非确定性源(例如硬件设备)对实现不可用。在这种情况下,每个
std::random_device
对象可以生成相同的数字序列


-
std::random\u设备


在宏计算结果为true的情况下,GCC决定以这种方式实现
random\u device
,但考虑到
if(!\M\u文件),我无法接受GCC的决定
检查,我的猜测是,
\u M_文件
是对构成潜在熵源的引用,如果没有它,GCC将退回到常规伪随机设备。

std::random_设备
甚至被允许是确定性的(即总是产生完全相同的序列).Nevermind被要求是物理随机的。
rdrand
并不像Mersenne twister。它是一种加密安全的PRNG,定期从硬件熵源重新设定种子。当然,在这种情况下,事实上,非确定性源是可用的。因此,严格的法律解读该句子将表明实现不正确。@user14717好吧,再说一遍:我不确定if(!\u m\u文件)到底是什么
正在执行。对象的否定对我来说意味着它正在检查是否缺少
\u M_文件
是什么,如果没有返回真值,
\u M_文件
将用于某些事情;但我不确定。从链接的github上看,
\u M_文件
应该指向表示随机设备的文件
random\u device
然后将尝试从该文件中读取
sizeof(result\u type)
字节。因此,您似乎正确地认识到,该实现正在尝试使用随机源,并返回到
\ux86\u rdrand();
。编辑:它也类似于
random\u device::entropy()
如果从该文件读取时出现问题,将返回零。@user14717-对“may-been-implemented”的“严格合法”读取允许它也可能不会以这种方式实现。我不知道引用的源应用了什么语言规则,但在标准中,“may”表示“允许”.另一方面,要求使用“应”。