Random 为什么ZIP在系统上如此高效。随机生成的序列-Kolmogorov的复杂性在哪里?

Random 为什么ZIP在系统上如此高效。随机生成的序列-Kolmogorov的复杂性在哪里?,random,zip,compression,complexity-theory,Random,Zip,Compression,Complexity Theory,我正在生成随机数序列。序列仅包括0和1。我将每个序列放在一个单独的文本文件中,然后尝试将该文件归档(以.zip格式)。我使用System.Random生成每个序列的元素。乍一看,这些序列似乎确实是随机的 奇怪的是,无论生成的.txt文件大小如何,压缩的.zip文件的大小始终等于.txt文件大小的17% 但从理论上讲,对于一个真正随机的序列,压缩后的.zip文件的大小应该与.txt文件的大小几乎相等——也就是说,应该几乎没有压缩。否则,序列至少是部分可预测的(这在这个类似“掷硬币”的实验中是不可能

我正在生成随机数序列。序列仅包括0和1。我将每个序列放在一个单独的文本文件中,然后尝试将该文件归档(以.zip格式)。我使用System.Random生成每个序列的元素。乍一看,这些序列似乎确实是随机的

奇怪的是,无论生成的.txt文件大小如何,压缩的.zip文件的大小始终等于.txt文件大小的17%

但从理论上讲,对于一个真正随机的序列,压缩后的.zip文件的大小应该与.txt文件的大小几乎相等——也就是说,应该几乎没有压缩。否则,序列至少是部分可预测的(这在这个类似“掷硬币”的实验中是不可能的)

这意味着我的“建造者”知道如何识别序列是由System.random中实现的特定伪随机生成器生成的

这里我有两个问题:

  • 如何生成归档程序无法压缩的伪随机序列?也许有一些已知的技巧

  • 为什么17%的比率如此稳定,并且不取决于序列的长度(即.txt文件的大小)


  • 谢谢你的帮助

    您声明只在文本文件中保存0和1。因此,在二进制级别,文件完全由位序列
    00110000
    00110001
    的出现组成(它们对应于字符
    '0'
    '1'
    的ASCII值)。这是非常浪费的,一个好的压缩算法会意识到它可以用较少的位数来表示这些8位模式中的每一个:最好是1位,但可能是1位和2位的组合,以获得您引用的~18%的压缩比

    如果要创建无法压缩的序列,则需要生成随机无界值,并将其作为二进制写入文件。例如:

    byte[] buffer = new byte[1024 * 1024];   // for a 1 MB file
    (new Random()).NextBytes(buffer);        // each byte gets a random value from 0 to 255
    File.WriteAllBytes(target, buffer);
    

    您是否将数字保存为文本,即ASCII字符?如果是这样,您实际上并不是在存储随机序列。@Alexander Gessler是的,我只是存储字符。但我想尝试另一种存储方式。将尝试使用二进制数组。一个关于如何存储数字的代码示例将非常有用。存储1和0的方法有很多:)注意,从技术上讲,这个序列是高度可压缩的。例如,SFX存档可以将其编码为种子、长度、PRNG算法(和样板)。即使加密PRNG也是可压缩的,如果你知道种子的话。