【发布时间】:2012-08-14 01:07:12
【问题描述】:
我一直在阅读有关随机数及其生成器的各种文章。我通常从中得出 3 个重要结论:
- 随机数并不是真正随机的
- 大部分时间他们都有偏差(模偏差)
- 当人类试图“随机行事”时,他们无法成为随机数生成器
因此,考虑到这些观察中的后一种情况,我们如何能够
- 判断我们看到的数字序列是否真的是随机的,更重要的是
- 有什么方法可以证明所述序列确实是随机的吗?
【问题讨论】:
标签: random proof perception
我一直在阅读有关随机数及其生成器的各种文章。我通常从中得出 3 个重要结论:
因此,考虑到这些观察中的后一种情况,我们如何能够
【问题讨论】:
标签: random proof perception
我很想说,只要您生成足够大的样本集 1,000,000+,您应该会或多或少地看到(伪)随机数的均匀分散。但是,我敢肯定,一些数学天才有办法抹黑这一点,因为根据概率法则,你肯定会得到一个数字的运行,就像任何其他序列一样。
根据我的阅读,如果您真的需要随机数,最好尝试重用加密库使用的内容。密码学领域显然很复杂,并且依赖于随机数来生成密钥。从OWASP's guide titled "Reversible Authentication Tokens" 的部分中它说...
生成安全身份验证令牌的唯一方法是确保 没有办法预测它们的顺序。换句话说:真正的随机 数字。
可以说计算机不能产生真正的随机 数字,但使用新技术,例如读取鼠标移动和 提高熵的关键笔画显着增加了 随机数生成器的随机性。关键是你不 尝试自己实现;使用现有的、经过验证的 实现是非常可取的。
大多数操作系统都包含生成随机数的功能 几乎可以从任何编程语言调用。
我的看法是,除非您自己编写加密库,否则请信任那些(例如使用 Java 加密扩展),这样您就不必自己证明。
【讨论】:
非常简单的测试:
如果你真的想测试随机数,你可以模拟一个输出 1-100 100 次随机数的程序作为例子。 然后看看这些数字,看看是否有任何模式。然后通过多次重新启动程序并重复该过程来进行该测试。 检查所有数据以确定随机数是否始终是随机的、只是在个别测试期间随机,还是从不随机。 :P
【讨论】:
测试随机数生成器可能主要取决于您要查找的内容。即使是纯粹的不可重复性也不能保证随机性。
有些公司会出于认证目的测试随机数生成器(例如在线赌场)。我很快找到了一个叫做 iTech Labs,尽管their testing methodology page 在技术细节方面还有很多不足之处。
其他测试人员和认证机构publish the required data for a certification;这里有更具体的细节,但没有你想要的那么多。
您可能会进行统计分析,并将随机数生成器的结果与“真实”随机源进行比较,但可能会因为试图将真实随机源转换为您的可能性空间而产生偏差。
【讨论】:
随机性测试验证序列的数学属性。例如进入频率(所有符号都应具有相同的频率)、局部方差、序列分析(符号的概率不得依赖于先前的概率)。 不存在明确的证明,但有一个品质因素——序列真正随机的概率。 另一个标准可以基于可压缩性:真正的随机性具有最大熵,因此不能被压缩。 当然,这个测试对于随机性是不可靠的,但允许使用 zlib 等现成的工具进行快速而肮脏的测试。
【讨论】: