1

在此处输入图像描述

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();

当您简单地向文本文件添加一些随机数然后压缩它会变大,否则它将保持与文本文件相同的大小

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

4

5 回答 5

6

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

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

于 2012-07-31T21:04:10.710 回答
5

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

原因很简单,它可以生成的唯一值不够小。
例子:

如果你有一个 10 位的世界,你可以生成 2^10 个值。假设您可以全部压缩它们。但是,如果您删除一点,则只能保留 2^9 个值。所以有很多原始值永远无法正确压缩,并解压缩回原始值。

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

于 2012-07-31T21:06:49.443 回答
1

我发现了一篇有趣的文章:

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

我还记得前段时间阅读了一项基于压缩算法声明授予的专利,该声明保证输出永远不会大于输入……我找不到同一篇文章,但我找到了这篇文章这更具挑战性:

http://gailly.net/05533051.html

享受阅读

于 2012-07-31T21:45:58.713 回答
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();
于 2012-07-31T21:13:05.460 回答
0

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

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

于 2012-07-31T21:07:45.733 回答