Я взял первые 1 мил бит из случайного видеофайла, а затем для каждого байта я отобразил каждый бит в корзину, например

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 ответ1

4

Это неудивительно, учитывая тип данных, которые вы просматриваете.

Видеопоток состоит из очень сильно сжатых данных.
Глядя на необработанные байты, они кажутся почти идеальными случайными данными.
Это основное свойство данных с высокой степенью сжатия (высокой энтропии).

И почти идеальные случайные данные имеют почти идеальное случайное распределение битов, что означает, что каждый отдельный бит имеет одинаковое распределение.

Если вы сделаете то же самое с огромным текстовым файлом ASCII, вы увидите, что старший значащий бит (2 ^ 7) не будет отображаться вообще (или только несколько раз), а пара других появится с ОЧЕНЬ высокими частотами. ,
Это связано с тем, что ASCII имеет очень искаженное распределение с наиболее часто используемыми значениями, сгруппированными в несколько небольших подмножеств в диапазоне 0..255.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .