假设我们有一个伪随机数生成器,它接受 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/