C++ 消耗std::random_设备的熵

C++ 消耗std::random_设备的熵,c++,random,g++,entropy,C++,Random,G++,Entropy,我使用的是std::random_设备,希望检查其剩余的熵。根据cppreference.com: [……] 返回值 设备熵的值,如果不适用,则为零 笔记 某些标准库中未完全实现此功能。例如,LLVM libc++始终返回零,即使设备是非确定性的。相比之下,微软Visual C++实现总是返回32,而BooST.Read返回10。 Linux内核设备/dev/uradom的熵可以使用ioctl RNDGETENTCNT获得-这就是GNU libstdc++中的std::random_device

我使用的是
std::random_设备
,希望检查其剩余的熵。根据cppreference.com:

[……]

返回值 设备熵的值,如果不适用,则为零

笔记 某些标准库中未完全实现此功能。例如,LLVM libc++始终返回零,即使设备是非确定性的。相比之下,微软Visual C++实现总是返回32,而BooST.Read返回10。 Linux内核设备/dev/uradom的熵可以使用ioctl RNDGETENTCNT获得-这就是GNU libstdc++中的std::random_device::entropy()从8.1版开始使用的

所以在LinuxANG++>=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
}
#包括
#包括
真空排放熵(标准::随机设备和rd,标准::大小\u t计数=1)
{
同时(计数-->0){
volatile const int discard=rd();
(作废)丢弃;
}
}
int main()
{
std::随机_装置rd;

std::cout库返回的熵值不会大于其结果类型中的位数,在本例中为32

见:

您链接到的文档解释了这一点:

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


库返回的熵值不会大于其结果类型中的位数,在本例中为32

见:

您链接到的文档解释了这一点:

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


您可以看到
.entropy()
是如何实现的

基本上,
entropy()
调用
ioctl(fd,RNDGETENTCNT,&ent)
,并返回
ent
(根据需要钳制目标类型中的最大位数后)

恰好在调用
drain\u entropy
后,它没有发生变化

您可以手动实现此方法,并查看其行为是否相同。
即使移除钳制,熵也几乎不会受到影响(甚至可能增加)。

您可以看到
.entropy()
是如何实现的

基本上,
entropy()
调用
ioctl(fd,RNDGETENTCNT,&ent)
,并返回
ent
(根据需要钳制目标类型中的最大位数后)

恰好在调用
drain\u entropy
后,它没有发生变化

您可以手动实现此方法,并查看其行为是否相同。
即使移除钳制,熵也几乎没有受到影响(甚至可能增加)

因为Linux内核支持查询其随机数生成器中的剩余熵并不意味着1)C++库使用内核的随机数生成器,和/或2)C++库有意义地实现剩余熵的返回。“Sam cppreference声称1”和2)是真的。@ YS:问题是什么?我看不到。这里有。@DanM。我希望从设备生成的数字会消耗它的熵。它不会。(Q固定)@YSC为什么你认为读取100万整数会以任何有意义的方式减少它?它的生成速度可能要快得多。在我的本地机器上,我不得不开始消耗
10^10
字节,以便它以有意义的方式减少。仅仅因为Linux内核支持在其随机数生成器中查询剩余的熵或者说,1并不意味着C++库使用内核的随机数生成器,和/或2)C++库有意义地实现剩余熵的回归。“Sam cppreference声称1”和“2”是真的。@ ys:问题是什么?我在这里没有看到。“丹姆。我期待从设备中产生的数字耗尽它的熵。它没有。(Q固定)@YSC为什么你认为读取一百万整数会以任何有意义的方式减少它?它的生成速度可能比这快。在我的本地机器上,我不得不开始消耗
10^10
字节,以便它以有意义的方式减少。我想32(
std::numeric\u limits::digits
)是最大熵,而不是返回值的最大值:DI到32(
std::numeric\u limits::digits
)是最大熵,而不是返回值的最大值:D
#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
}
const int max = sizeof(result_type) * __CHAR_BIT__;
if (ent > max)
  ent = max;