Tirei os primeiros 1mil bits de um arquivo de vídeo aleatório e, em seguida, para cada byte, mapei cada bit para uma lixeira, por exemplo
c_b = ''.join(format(ord(b), '08b') for b in c)
bin1.append(c_b[0])
Então contou:
bin1_counted = Counter(bin1)
e os resultados foram:
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})
Mostra claramente uma distribuição igual. Mas eu esperava que alguém pudesse me explicar por que isso é assim, considerando minha suposição de que o primeiro bit em cada byte deveria ter muito mais do 0
que 1
porque estou pensando que é provável que deva haver algum tipo de distribuição de sino de todos os bytes ', ou seja, eu esperava que o primeiro / segundo bit de cada byte tivesse muito mais, 0
pois os caracteres podem ser representados antes de chegar a 64?
ord(b), '08b') for b in c
. Eu tenho queord()
cada próximo personagem?Respostas:
Isso não é surpreendente, dado o tipo de dados que você está vendo.
Um fluxo de vídeo consiste em dados muito altamente compactados.
Olhando para os bytes brutos, eles aparecem como dados aleatórios quase perfeitos.
Essa é uma propriedade básica de dados com alta compactação (alta entropia).
E dados aleatórios quase perfeitos têm uma distribuição aleatória quase perfeita dos bits, o que significa que cada bit individual tem uma distribuição igual.
Se você fizer o mesmo em um grande arquivo de texto ASCII, verá que o bit mais significativo (2 ^ 7) não aparecerá (ou apenas algumas vezes no máximo) e mais alguns aparecerão com MUITO altas frequências .
Isso ocorre porque o ASCII tem uma distribuição muito distorcida com os valores mais usados agrupados em alguns pequenos subconjuntos dentro do intervalo 0..255.
fonte