【发布时间】:2015-04-08 01:48:27
【问题描述】:
我想检查我是否执行了std::random_device
具有非零熵(即不确定),使用std::random_device::entropy() 函数。然而,根据
给cppreference.com
"这个功能在一些标准库中没有完全实现。 例如,gcc 和 clang 总是返回零,即使设备 是非确定性的。相比之下,Visual C++ 总是返回 32, boost.random 返回 10。”
有没有办法找到真正的熵?特别是做现代 计算机(MacBook Pro/iMac 等)具有不确定的来源或随机性,例如使用散热监视器?
【问题讨论】:
-
en.wikipedia.org/wiki/RdRand - Ivy Bridge x86 处理器提供了一个随机数,至少可以保存用于加密目的。
-
有一个很好的老技巧,即生成大量随机数,将它们写入文件并使用 gzip 或类似方法对其进行压缩。然后将压缩比与从已知高熵源(如
/dev/random)和已知低熵源(如1、2、3,...)获得的样本的压缩率进行比较。 -
我只是这样做了,发现
std::random_device和/dev/urandom之间没有区别(这并不奇怪,因为 GCC 的 libstdc++ 在后者方面实现了前者)。 但是,我也认为未播种的std::rand()(来自cstdlib)没有区别,这表明基准测试不够严格。 -
@5gon12eder 感谢您的想法和尝试。是的,这并不奇怪,因为区分好的 PRNG 和 RNG 是一件相当棘手的事情。如果 zip 算法达到压缩限制(即源的香农熵),它可能很有用,但实际上并非如此。