std::random_device是如何实现的
How std::random_device is implemented
我在Win7上用MSVC 2017测试了以下迷你示例:
#include <iostream>
#include <random>
int main()
{
std::random_device rd;
std::cout << "entropy: " << rd.entropy() << std::endl;
return 0;
}
令我惊讶的是,它输出的是"熵:32"。这意味着rd产生真实的随机数,而不是伪随机数。我期望的是"熵:0"。据我所知,没有一个有限长度的代码能够产生真正的随机数,这需要一个真正的专门设计的物理设备。没有这样的设备连接到我的测试PC上。
我的问题是:std::random_device是如何实现的,它在没有特殊硬件支持的情况下产生真实的随机数?
首先,您是否确定您的电脑中没有专门设计的物理设备?英特尔在2013年将此类硬件添加到CPU中,AMD在2015年也紧随其后。
其次,通过测量等物理过程的定时抖动,可以获得相当好的熵
- 网络数据包
- 硬盘(如果硬盘是SSD,则用处较小(
- 鼠标移动
- 键盘咔嗒声
对于台式机或笔记本电脑来说,获得良好的熵并没有那么难。更具挑战性的是在受限的环境中,如智能卡或物联网设备首次启动时(没有太多网络数据包,但你想生成一个好的公钥/私钥对(。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如何实现内部实现依赖于模板参数的类
- 我的 PRNG 实现与我尝试复制的实现有何不同?