Text 各种压缩软件程序的有趣行为

Text 各种压缩软件程序的有趣行为,text,compression,Text,Compression,我试图压缩一个64兆字节的文本文件,其中只包含7个不同的字母,随机分布,出现频率大致相似 我注意到各种压缩软件程序(如7Zip和WinRar)的一个有趣行为。 这两种应用程序实现了约35%的压缩比 当文件包含8个不同的字母时,它们也是随机分布的,并且以近似的频率出现,压缩比小于0.3% 有人能解释一下吗 谢谢。这只能由您如何用“8个不同字母”构造文件的错误来解释。您用七个不同字母构建的文件看起来是正确的,因为压缩比应该是log2(7)/8,即0.351。对于具有八个字母的同一事物,压缩比为log

我试图压缩一个64兆字节的文本文件,其中只包含7个不同的字母,随机分布,出现频率大致相似

我注意到各种压缩软件程序(如7Zip和WinRar)的一个有趣行为。 这两种应用程序实现了约35%的压缩比

当文件包含8个不同的字母时,它们也是随机分布的,并且以近似的频率出现,压缩比小于0.3%

有人能解释一下吗


谢谢。

这只能由您如何用“8个不同字母”构造文件的错误来解释。您用七个不同字母构建的文件看起来是正确的,因为压缩比应该是log2(7)/8,即0.351。对于具有八个字母的同一事物,压缩比为log2(8)/8,即0.375

也许您的文件中有一个重复的八个字母的模式

更新:

您正在使用
rand()
生成“随机”分布。不幸的是,
rand()
的经典实现在低几位中的随机性非常差,并且有重复的模式。您的
%7
使用了
rand()
中的所有位,但
%8
仅使用低位的三位<代码>%8相当于
&7


改为使用
random()
,它会生成随机数,其中低位以及任何位都具有良好的随机行为。

这只能通过错误地使用“8个不同的字母”构造文件来解释。您用七个不同字母构建的文件看起来是正确的,因为压缩比应该是log2(7)/8,即0.351。对于具有八个字母的同一事物,压缩比为log2(8)/8,即0.375

也许您的文件中有一个重复的八个字母的模式

更新:

您正在使用
rand()
生成“随机”分布。不幸的是,
rand()
的经典实现在低几位中的随机性非常差,并且有重复的模式。您的
%7
使用了
rand()
中的所有位,但
%8
仅使用低位的三位<代码>%8相当于
&7


改为使用
random()
,它会生成随机数,其中低位以及任意位都具有良好的随机行为。

谢谢您的回答。下面是我的代码。我使用%8和%7生成文件#include#include char txt[64*1024*1024];int main(void){int i;for(i=0;irand()对于任何应用程序来说都是一个糟糕的选择。永远不要使用它。确实,rand()&7的周期为2^20(1048576)。谢谢您的回答。下面是我的代码。我使用%8和%7生成文件#include#include char txt[64*1024*1024];int main(void){int i;for(i=0;irand()对于任何应用程序来说都是一个糟糕的选择。永远不要使用它。确实,rand()&7的周期为2^20(1048576)