c++ - 使用来自更好随机源的随机数播种伪随机生成器

标签 c++ c security random entropy

假设我们有一个伪随机数生成器,它接受 32 位整数作为种子(例如 C 标准库中的 rand() 函数),它从原始种子派生随机数。如果该种子来自放射性衰变,那么假设我们通过调用 rand() 获得的随机数与从放射性衰变生成随机数一样“好”随机数是否正确?腐烂?

最佳答案

不,绝对不是。 C/C++ 标准库的内置 rand() 函数通常实现为 linear congruential generator (LCG)。它是最早已知的伪随机数生成器 (PRNG) 系列之一,并且它们通常具有非常糟糕的统计特性。此外,由于 PRNG 实际上产生由初始种子预先确定的数学序列,因此它们是可预测的。即使加密安全的伪随机数生成器(如 Blum Blum Shub )也是可预测的,即使预测序列在计算上很困难且非常耗时。

相比之下,基于放射性衰变的随机数生成器才是真正的随机数生成器。生成的数字序列完全均匀分布且不可预测,样本之间没有任何可测量的相关性。

回到伪随机数,初始种子源的统计质量不会提高生成的伪随机序列的统计质量 - 它仅取决于生成器本身。如果您使用真正的随机数来为 PRNG 提供种子,那么序列的第一个数字将是不可预测的,但序列的质量将与没有真正的随机种子时的质量相同。

如果你想要高质量的随机性,你必须使用高质量的随机数生成器。有一些伪随机数生成器具有出色的统计特性(绝对不是著名的 Mersenne Twister ),通过了所有当前的随机性统计测试 - 虽然生成的伪随机序列仍然是可预测的,但在统计上很难将其与真正的随机序列。

关于现代随机数生成器的一个很好的可靠资源是 Sebastiano Vigna's website .

关于c++ - 使用来自更好随机源的随机数播种伪随机生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44179765/

相关文章:

c++ - Entries(<key,values>) 未在映射中输入

c - 为什么这个程序会给出以下输出?

c++ - malloc()/free()/new/delete/delete[] 的算法复杂度是多少?

javascript - 地址栏中的Facebook javascript,可以复制吗?

c++ - 读取器/写入器锁 (c++)

C++ 返回复制对象

c++ - 所有 STL 容器的通用哈希函数

c - 将数据文件作为整数数组发送和接收到 C 中的函数

google-chrome - http://a/%% 30%30如何工作?

security - 网站编程漏洞 list