引自cppreference:
std :: random_device是一个非确定性随机数引擎,但如果不支持非确定性随机数生成,则允许实现使用伪随机数引擎实现std :: random_device。
有没有办法检查当前实现是否使用PRNG而不是RNG(然后说出错并退出),如果没有,为什么不呢?
请注意,一点点谷歌搜索显示至少MinGW以这种方式实现std::random_device
,因此如果要使用std::random_device
,这是真正的危险。
--- ---编辑
此外,如果答案是否定的,并且有人可以提供一些见解,为什么没有这样的功能/特征/ 某些东西我会非常感兴趣。
答案 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推荐的测试