有没有办法检查std :: random_device是否实际上是随机的?

Xar*_*arn 8 c++ random c++11

引用cppreference:

std :: random_device是一个非确定性随机数引擎,但如果不支持非确定性随机数生成,则允许实现使用伪随机数引擎实现std :: random_device.

有没有办法检查当前实现是否使用PRNG而不是RNG(然后说出错并退出),如果没有,为什么不呢?

请注意,一点点谷歌搜索显示至少MinGW std::random_device以这种方式实现,因此如果std::random_device要使用它是真正的危险.

---编辑---
而且,如果答案是否定的,有人可以给一些见解,为什么没有这样的功能/特征/ 东西,我会很感兴趣.

Jos*_*eld 9

有没有办法检查当前实现是否使用PRNG而不是RNG(然后说出错并退出),如果没有,为什么不呢?

有一种方法:如果用随机数引擎实现std::random_device::entropy它将返回0.0(也就是说,它是确定性的).

从标准:

double entropy() const noexcept;
Run Code Online (Sandbox Code Playgroud)

返回:如果实现使用随机数引擎,则返回0.0.否则,返回由operator()范围min()to 返回的随机数的熵估计log_2(max() + 1).

  • 根据标准,你完全正确.但是,我在cpprefeference.com上读到*"这个函数在某些标准库中没有完全实现.例如,即使设备是非确定性的,gcc和clang总是返回零.相比之下,Visual C++总是返回32,并且boost.random返回10."* (4认同)