如何测试某些数字是否在一个区间内均匀分布?

时间:2017-04-13 09:51:11

标签: c++ algorithm statistics distribution

我正在寻找一种算法(最好使用c ++中的库)或某种想法告诉我统计上某些数字是否以统一的方式分布在一个区间内。想象一下,我有两个字符串:第一个是无错误,第二个在某些点有一些错误。我想检查字符串中错误的位置是否具有统计意义。

考虑以下示例。在第一种情况下,错误是均匀分布的,而在第二种情况下,它们都在字符串的末尾,我的算法应该给出一些警告。

 error-free string: 0110110101010110101 (3 errors occur at pos:5,12,15 )
 erroneous string : 0110010101000100101

sedond示例:

 error-free string: 0110110101010110101 (3 errors occur at pos:17,18,19 )
 erroneous string : 0110110101010110010

我可以说第一个数据中的错误是正常的,但不是第二个数据中的错误。

到目前为止,我结束了这个想法:我想将字符串拆分为相等的bin,假设字符串长度为100.我选择10个bin大小10.然后我查看字符串中的错误总数我们可以假设是10.我希望每个箱子看到1个错误。现在我根据我的期望计算出我的观察结果。任何人都知道这种方法是否正确?如果它有效,那么每个垃圾箱应该有多大。它还应该取决于错误的数量吗?

1 个答案:

答案 0 :(得分:1)

你建议的方法是将字符串拆分成垃圾箱,期望看到错误的数量或多或少均匀地分布在垃圾箱中,对于诸如“每个第十个位置都有错误”之类的模式是盲目的。我认为你需要一种更通用的方法来区分错误发生的情况与存在错误的位置无关的情况。

换句话说,我认为你实际上正在寻找一种方法来衡量二进制字符串随机的程度,或者更准确地说,是无模式的。字符串模式的最终数学定义是字符串Kolmogorov complexity,定义为输出字符串的最短程序的长度。可悲的是,Kolmogorov的复杂性是不可计算的。

计算二进制字符串的无模式的一种可行方法是使用Linear Hadamard Spectral Test。可以使用Fast Fourier Transform来实现测试,以便及时运行O(n logn),其中n是字符串的长度。但是,在我看来,似乎没有准备好在C ++中使用测试的实现。

假设您愿意为了易于实现而在测试的稳健性上做出一点妥协,您可以使用以下方法:测量字符串的无模式,只需gzip一个文件其内容是字符串,然后检查压缩率。压缩越严重,字符串越无模式。该方法依赖于gzip包含Kolmogorov复杂性的某些方面这一事实。特别是,存在一些易于检测的模式可以提高压缩比。