gcc的`std :: random_device`实现正确吗?

时间:2019-05-21 20:52:52

标签: c++ random-seed

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的实现的思考过程是否正确?为什么?

1 个答案:

答案 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将回退到常规的伪随机设备。