为什么字节中的位是均匀分布的?

为什么字节中的位是均匀分布的?

我从一个随机视频文件中取出前 1mil 位,然后将每个字节的每个位映射到一个 bin,例如

c_b = ''.join(format(ord(b), '08b') for b in c)
bin1.append(c_b[0])

然后数了一下:

bin1_counted = Counter(bin1)

结果是:

Counter({'0': 646491, '1': 603686})
Counter({'0': 642133, '1': 608044})
Counter({'0': 644298, '1': 605879})
Counter({'0': 641961, '1': 608216})
Counter({'0': 641778, '1': 608399})
Counter({'0': 640538, '1': 609639})
Counter({'0': 641531, '1': 608646})

它清楚地显示了均匀分布。但我希望有人能向我解释为什么会这样,因为我假设每个字节的第一位应该比这个多得多,0因为1我认为每个字节的位置可能都有某种钟形分布,也就是说,我预计每个字节的第一/第二位应该有更多,0因为字符可以在达到 64 个之前表示出来?

答案1

考虑到您正在查看的数据类型,这并不奇怪。

视频流由高度压缩的数据组成。
查看原始字节,它们看起来几乎是完美的随机数据。
这是高压缩(高熵)数据的基本属性。

近乎完美的随机数据具有近乎完美的位随机分布,这意味着每个位都有均匀的分布。

如果您对大型 ASCII 文本文件执行相同操作,您会发现最高有效位 (2^7) 根本不会出现(或最多只出现几次),而其他几个位会以非常高的频率出现。
这是因为 ASCII 的分布非常不均匀,最常用的值集中在 0..255 范围内的几个小子集中。

相关内容