一些可执行代码可以巧妙地说明这个概念。 我们开始 (in R
) 使用一个好的伪随机数生成器来创建一个由 10,000 个 0 和 1 组成的序列:
set.seed(17)
x <- floor(runif(10000, min=0, max=2))
这通过了一些基本的随机数测试。 例如,将平均值与进行比较的 t 检验的 p 值为 %,这使我们能够接受零和一的可能性相等的假设。1/240.09
从这些数字中,我们继续提取从第 5081 个值开始1000
x0 <- x[1:1000 + 5080]
如果这些看起来是随机的,它们也应该通过相同的随机数测试。例如,让我们测试它们的平均值是否为 1/2:
> t.test(x0-1/2)
One Sample t-test
data: x0 - 1/2
t = 2.6005, df = 999, p-value = 0.009445
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
0.01006167 0.07193833
sample estimates:
mean of x
0.041
低 p 值(小于 1%)强烈表明平均值显着大于。确实,这个子序列的累计和有很强的上升趋势:1/2
> plot(cumsum(x0-1/2))
这不是随机行为!
将原始序列(绘制为累积总和)与该子序列进行比较可以揭示发生了什么:
长序列确实表现得像随机游走——正如它应该的那样——但我提取的特定子序列包含相同长度的所有子序列中最长的向上上升。看起来我也可以提取其他一些表现出“非随机”行为的子序列,例如以为中心的子序列,其中连续出现大约 20 个子序列!9000
正如这些简单的分析所表明的,没有任何测试可以“证明”一个序列是随机的。我们所能做的就是测试序列是否足够偏离随机序列的预期行为,以提供它们不是随机的证据。 这就是随机数测试组的工作原理:它们寻找随机数序列中极不可能出现的模式。每隔一段时间,它们就会使我们得出这样的结论:真正随机的数字序列并不显得随机:我们会拒绝它并尝试其他方法。
不过,从长远来看——就像我们都死了一样——任何真正的随机数生成器都会生成每一个可能的 1000 位数字序列,并且它会无限次这样做。将我们从逻辑困境中解救出来的是,我们必须等待很长时间才能发生这种明显的异常。