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

时间:2015-01-11 11:57:39

标签: c++ c++11 random

引自cppreference

  

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

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

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

--- ---编辑
此外,如果答案是否定的,并且有人可以提供一些见解,为什么没有这样的功能/特征/ 某些东西我会非常感兴趣。

2 个答案:

答案 0 :(得分:9)

  

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

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

来自标准:

double entropy() const noexcept;
     

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

答案 1 :(得分:0)

没有100%安全的方法来确定真正的随机性。使用黑匣子方法,您可以做的最好的事情是显示证据,如果它不是完全随机的:

  • 首先,您可以通过生成大量随机的munmbers并对其分布进行统计来验证分布似乎是随机的(例如,生成0到1000之间的100万个随机数)。如果某些数字看起来比其他数字显着更频繁,那么显然它并不是真正随机的。

  • 接下来你可以运行几次在同一个初始种子后生成随机数的程序。如果你获得相同的随机数序列,那么它肯定是PRNG而不是真正的randmness。但是,如果你没有获得相同的序列,它就不会产生任何结果:库可以使用某种自动种子(使用时钟滴答或其他东西)来隐藏/改善伪随机性。

  • 如果您的应用程序高度依赖于随机性质量(例如加密质量),您应该考虑更多测试,例如NIST SP 800-22推荐的测试