@余天升给出了一个直观的答案,不过这只是一个非常特殊的特例,实际上绝大多数随机数发生器用这种方法根本看不出来质量。

正确的方法应该是参考德国联邦信息安全办公室给出了随机数发生器质量评判的四个标准。PDF链接在这里https://www.bsi.bund.de/cae/servlet/contentblob/478152/publicationFile/30552/ais20e_pdf.pdf
里面列出了四个判别随机数序列质量的准则

  • K1 — A sequence of random numbers with a low probability of containing identical consecutive elements.
  • K2 — A sequence of numbers which is indistinguishable from ‘true random’ numbers according to specified statistical tests.
  • K3 — It should be impossible for any attacker (for all practical purposes) to calculate, or otherwise guess, from any given sub-sequence, any previous or future values in the sequence, nor any inner state of the generator.
  • K4 — It should be impossible, for all practical purposes, for an attacker to calculate, or guess from an inner state of the generator, any previous numbers in the sequence or any previous inner generator states.

大致翻译:

  • K1——相同序列的概率非常低
  • K2——符合统计学的平均性,比如所有数字出现概率应该相同,卡方检验应该能通过,超长游程长度概略应该非常小,自相关应该只有一个尖峰,任何长度的同一数字之后别的数字出现概率应该仍然是相等的等等
  • K3——不应该能够从一段序列猜测出随机数发生器的工作状态或者下一个随机数
  • K4——不应该从随机数发生器的状态能猜测出随机数发生器以前的工作状态

我们一般用的随机数发生器至少要符合K1和K2,而用于加密等应用的随机数发生器应该符合K3和K4。

@余天升的例子里,应该是PHP的随机数发生器不满足K2。这是一个非常巧的例子,只是PHP 5在Windows底下调用rand()函数的时候会有这样的情况,别的组合不会产生这么巧的图像。实际上PHP提供了一个质量高的多,非常好的随机数发生器mt_rand(),在涉及网页安全的时候请选用这个函数。关于mt_rand()的原理,可以参考这个关于梅森旋转算法的Wiki网站:梅森旋转算法 / Mersenne twister (英文)。

— 完 —

本文作者:知乎用户(登录查看详情)

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 9 个回答,查看全部。
延伸阅读:
Gravatar 的随机头像是用什么算法生成的?
ACM 中常用的算法有哪些?

分享到