如果我有 N 个字节的数据,我该如何计算可能的不同组合? 我的第一个想法是,因为每个字节实际上只有8个位,所以我应该计算出唯一可能的位组。
所以我把它放在Java中:
private void bytePossibilities(int numberOfBytes) {
final int BITS_IN_A_BYTE = 8;
final int numberOfBits = numberOfBytes * BITS_IN_A_BYTE;
long totalPossibilities = 0;
for (int i = 0; i < (1 << numberOfBits); i++) {
int[] next = new int[numberOfBits];
for (int j = 1, a = 1; j < (1 << numberOfBits); j <<= 1, a++) {
next[numberOfBits - a] = (i & j) == 0 ? 0 : 1;
}
System.out.println(Arrays.toString(next));
totalPossibilities++;
}
System.out.println(totalPossibilities + " combinations found for "+ numberOfBytes +" bytes");
}
这似乎有用......
bytePossibilities(1)
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
...252 other combinations...
[1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 1]
256 combinations found for 1 bytes
bytePossibilities(2)
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
...65532 other combinations...
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
65536 combinations found for 2 bytes
因此,给出 N 字节数据的明显可能性是2 ^(字节* 8)。 我只是想确保我正确地做到了这一点。似乎极端的是,任何2个随机字节的数据(彼此相邻)完全相同的几率是65,536中的1和任何3个字节,在16,777,216中为1。
如果有人能够更多地了解这一点,我会很感激。
答案 0 :(得分:1)
除了你的上一次发言外,你是对的
两个随机字节相同的概率是1(256)(第一个字节可以是任何东西,但第二个字节必须与第一个字节相同)。另一种思考方式 - 有256对相同的字节和256 *(1/65536)= 1/256。
你可以将它扩展到三个字节...当你查看三个随机字节的任何序列并想知道它们都是相同的概率时,你真的要问&#34;概率是多少?第二个和第三个与第一个相同&#34;?答案是(1/256)*(1/256)。
实际上字节不会发生&#34;随机&#34; - 特别是在未压缩数据中存在重要模式,因此对于大多数文件类型,这些概率不会转换为对等和三元组的等效观察频率。
答案 1 :(得分:0)
你是对的。每个数据位都可以有两个值(0或1)之一。所以,如果你有一位,有两种可能性。如果你有两个位,第一位有2位,第二位有2位,所以2 * 2 = 2 ^ 2。继续这个想法,你有一个字节的2 ^ 8种可能性和k字节的2 ^(k * 8)。
这只是使用产品规则,其中指出如果您有 a 方法来执行一项任务,并且 b 方式可以执行另一项任务事情,这两个任务是独立的,那么如果你做两个任务,你有 a * b 完成这两个任务的方法。希望这是有道理的。