std::random_device
的{{3}}对我来说很奇怪。具体来说,第137行:
random_device::result_type
random_device::_M_getval()
{
#if (defined __i386__ || defined __x86_64__) && defined _GLIBCXX_X86_RDRAND
if (!_M_file)
return __x86_rdrand();
#endif
假定所有这些数量均已定义。然后,当我在std::random_device
实例上调用call运算符时,我从rdrand
指令中得到结果。但是rdrand
并没有实现随机设备。 rdrand
是一个伪随机数生成器,比物理来源或随机性更接近(例如)梅森扭曲器。
我期望在这里调用rdseed
内建函数/本征函数,因为rdseed
查询一个通过gcc implementation产生随机数的电路。在我看来,这更像是一个“设备”。
但是我对随机数的产生了解不多。那么我对std::random_device
的实现的思考过程是否正确?为什么?
答案 0 :(得分:1)
std::random_device
被允许回退到伪随机生成器如果不确定性源(例如,硬件设备)不可用于实现,则可以根据实现定义的伪随机数引擎来实现
std::random_device
。在这种情况下,每个std::random_device
对象都可以生成相同的数字序列。—
std::random_device
,C++ Reference
在宏评估为true的情况下,我无法说服GCC以这种方式实施random_device
的决定,但是在给定if(!_M_file)
的情况下,我的猜测 _M_file
是对构成潜在熵源的引用,如果没有,则GCC将回退到常规的伪随机设备。