如果压缩包含随机数的文件,它会变大

时间:2012-07-31 21:01:15

标签: c# .net random compression

enter image description here

var file = new FileStream("random.txt", FileMode.Create);
var random = new Random();
for (int i = 0; i < 100000000; i++)
{
     var bytesToWrite = BitConverter.GetBytes(random.Next(int.MaxValue));
     file.Write(bytesToWrite, 0, bytesToWrite.Length);
}
file.Close();

当你只是在文本文件中添加一些随机数时 然后压缩它变得更大,或者它将保持与文本

相同的大小

任何人都知道如何为什么这会发生?

5 个答案:

答案 0 :(得分:6)

文本文件倾向于很好地压缩,因为它们反复使用相同的数据。向文件中添加一些随机数会使文件不那么规律,因此大多数压缩算法都会更难以压缩文件。

阅读压缩算法以更好地理解这一点。 https://en.wikipedia.org/wiki/File_compression

答案 1 :(得分:5)

压缩算法不会保证它会变小。

原因很简单,没有足够的唯一值可以生成更小的 例如:

如果您有10位世界,则可以生成2 ^ 10个值。让我们假设你可以压缩它们。但是,如果你删除一点,你只能拥有2 ^ 9个值。因此,有许多原始值永远无法正确压缩,并且会解压缩回原始值。

因此,大多数压缩算法都会考虑到普通数据不是随机的,并且是重复的,或者背后有一些基本规则。
像文本只使用了一定数量的字符,所以你可以很好地压缩它们。

答案 2 :(得分:1)

嗯,你生成的是随机二进制文件。当然,WinRar很难压缩它。

如果您将文件保存为txt,将数字作为文本保存,您将看到有压缩空间。

    var file = File.CreateText("random.txt");
    var random = new Random();
    for (int i = 0; i < 1000000; i++)
    {
        file.Write(random.Next());
    }
    file.Close();

答案 3 :(得分:1)

我发现一篇有趣的文章:

http://matt.might.net/articles/why-infinite-or-guaranteed-file-compression-is-impossible/

此外我还记得前段时间读过基于压缩算法声称授予的专利,该算法保证输出的输出永远不会大于输入...我找不到相同的文章但是我有发现这个更具挑战性:

http://gailly.net/05533051.html

享受阅读

答案 4 :(得分:0)

如果字节顺序是真正随机的,那么您将不会注意到大小的任何变化。甚至有一些rar文件可能比它包含的文件大的实例(我假设是因为rar容器中头文件的一些开销)。

看看这里:http://en.wikipedia.org/wiki/Data_compression