如何测试某些数字是否沿区间均匀分布?

How to test if some numbers are uniformly distributed along an interval?

本文关键字:区间 是否 分布 数字 何测试 测试      更新时间:2023-10-16

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

请考虑以下示例。在第一种情况下,错误是均匀分布的,在第二种情况下,它们都位于字符串的末尾,我的算法应该对此发出一些警报。

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

塞顿示例:

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

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

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

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

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

计算二进制字符串无模式的一种可行方法是使用线性哈达玛光谱测试。可以使用快速傅立叶变换实现测试,以便在O(n logn)n是字符串的长度时运行。但是,在我看来,C++ 年没有现成的测试实现。

假设你愿意为了便于实现而在测试的健壮性上做出一点妥协,你可以使用以下方法:要测量字符串的无模式性,只需 gzip 一个内容为字符串的文件,然后检查压缩率。压缩越差,字符串就越无图案。该方法依赖于这样一个事实,即gzip包含了柯尔莫果洛夫复杂性的某些方面。特别是,存在一些易于检测的模式提高了压缩率。