我正在使用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)。