我从一个随机视频文件中取出前 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 范围内的几个小子集中。