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

さて、あなたが生成するのはランダムなバイナリファイルです。もちろん、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 に答える
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 に答える
0

バイト順序が本当にランダムである場合、サイズの変化に気付くことはありません。rarファイルが含まれているファイルよりも大きくなる場合もあります(rarコンテナのヘッダーからのオーバーヘッドの一部があるためだと思います)。

ここを見てください:http://en.wikipedia.org/wiki/Data_compression

于 2012-07-31T21:07:45.733 に答える