我一直在阅读有关随机数及其生成器的各种文章。我通常会从中得出 3 个重要的结论:
- 随机数并不是真正随机的
- 很多时候他们有偏差(模偏差)
- 当人类试图“随机行动”时,他们无法成为随机数生成器
因此,考虑到这些观察结果中的后者,我们将如何能够
- 判断我们看到的一系列数字是否真的是随机的,更重要的是
- 有什么方法可以证明所说的序列真的是随机的吗?
我一直在阅读有关随机数及其生成器的各种文章。我通常会从中得出 3 个重要的结论:
因此,考虑到这些观察结果中的后者,我们将如何能够
非常简单的测试:
如果您真的想测试随机数,您可以模拟一个输出 1-100 100 次随机数的程序作为示例。然后看看这些数字,看看是否有任何模式。然后通过多次重新启动程序并重复该过程来执行该测试。检查所有数据以确定随机数是否总是随机的、只是在个别测试期间随机,或者从不随机。:P
随机性测试验证序列的数学特性。例如进入频率(所有符号都应具有相同的频率)、局部方差、序列分析(符号的概率不得依赖于先前的概率)。不存在明确的证明,但有一个品质因素——序列真正随机的概率。另一个标准可以基于可压缩性:真正的随机性具有最大熵,因此不能被压缩。当然,这个测试对于随机性是不可靠的,但是允许使用 zlib 等现成的工具进行快速而肮脏的测试。
我很想说,只要您生成足够大的样本集 1,000,000+,您应该或多或少地看到(伪)随机数的均匀分散。但是,我敢肯定,一些数学天才有办法抹黑这一点,因为根据概率法则,你肯定可以像任何其他序列一样得到一个数字的运行。
根据我的阅读,如果您真的需要随机数,最好尝试重用加密库使用的内容。密码学领域显然很复杂,并且依赖于随机数来生成密钥。从OWASP 指南中标题为“可逆身份验证令牌”的部分中,它说...
生成安全身份验证令牌的唯一方法是确保无法预测它们的顺序。换句话说:真正的随机数。
可以说计算机无法生成真正的随机数,但使用读取鼠标移动和击键等新技术来提高熵显着增加了随机数生成器的随机性。不要试图自己实现这一点,这一点至关重要;使用现有的、经过验证的实现是非常可取的。
大多数操作系统都包含生成随机数的函数,这些随机数几乎可以从任何编程语言中调用。
我的看法是,除非您自己编写加密库,否则请信任那些(例如使用 Java 加密扩展),这样您就不必自己证明它。