我正在使用std::random_device,并希望检查其剩余的熵。根据cppreference.com:


  std::random_device::entropy

double entropy() const noexcept;

  
  [...]
  
  返回值
  
  设备熵的值;如果不适用,则为零。
  
  笔记
  
  在某些标准库中,此功能未完全实现。例如,即使设备不确定,LLVM libc ++始终返回零。相比之下,Microsoft Visual C ++实现始终返回32,而boost.random返回10。
  
  可以使用ioctl RNDGETENTCNT获得Linux内核设备/ dev / urandom的熵-这是GNU libstdc ++自版本8.1起使用的std :: random_device :: entropy()的含义。


所以在Linux ang g ++> = 8.1下,我应该很好...但是我不是:

#include <random>
#include <iostream>

void drain_entropy(std::random_device& rd, std::size_t count = 1)
{
    while (count --> 0) {
        volatile const int discard = rd();
        (void) discard;
    }
}

int main()
{
    std::random_device rd;
    std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
    drain_entropy(rd, 1'000'000);
    std::cout << "Entropy: " << rd.entropy() << '\n'; // Entropy: 32
}


Live demo on Coliru (which runs under Linux, right?)

我期望从设备生成数字会消耗其熵。但事实并非如此。

发生了什么?

最佳答案

该库将不会返回大于其结果类型的位数(在这种情况下为32)的熵值。

参见libstd code

const int max = sizeof(result_type) * __CHAR_BIT__;
if (ent > max)
  ent = max;


您链接到的文档对此进行了解释:


  获取随机数设备熵的估计值,该估计值是介于0和log 2(max()+ 1)之间的浮点值(等于std :: numeric_limits :: digits)。

08-16 08:30