这个概念可以通过一些可执行代码很好地说明。 我们首先R
使用一个好的伪随机数生成器创建10,000个零和一的序列:
set.seed(17)
x <- floor(runif(10000, min=0, max=2))
这通过了一些基本的随机数测试。 例如,t检验均值比较,具有的p值40.09%,这使我们能够接受的假设零和同样有可能。1/240.09
从这些数字中,我们继续提取从5081st值开始的连续值的子序列: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个数字的每个可能序列,并且它将无限次生成。从逻辑难题中解脱出来的是,我们将不得不等待很长时间才能出现这种明显的像差。