Ali*_*Ali 1 java arrays sorting random
如果数组填充如下:
for (int i = 0; i < rand.length; i++) {
rand[i] = (int) Math.round(Math.random() * 1000000) + 1;
}
Run Code Online (Sandbox Code Playgroud)
然后使用Arrays.sort或任何排序算法进行排序,如果有的话
int sum = 0;
for(int i = 0; i < rand.length;i++) {
if (i % 2 == 0) {
sum += rand[i] + rand[rand.length - 1 -i];
}
else
sum -= rand[i] + rand[rand.length - 1 - i];
}
System.out.println("\n");
System.out.println(sum);
Run Code Online (Sandbox Code Playgroud)
然后总和将始终为零.这已经证明了我已经测试过它的一百次左右.尝试任何范围,任何数组长度.
我无法想象伪随机性真的会有缺陷.这里发生了什么?
您的随机数生成器提供的数字无关紧要.只要数组的长度为偶数,使用该函数计算的总和将始终为零.
让我们用数学方法证明这一点.假设我们有四个元素的数组:[A, B, C, D].(价值无关紧要,我会证明这一点.)
每次循环:
i = 0:sum += A + D.总和现在A + D.i = 1:sum -= B + C.总和现在(A + D) - (B + C).i = 2:sum += C + B.总和现在(A + D) - (B + C) + (C + B)i = 3:sum -= D + A.总和现在(A + D) - (B + C) + (C + B) - (D + A).如果我们扩展这个,我们得到A + D - B - C + C + B - D - A.一切都取消了; 结果为零.总是.
同样的原则适用于任何偶数长度阵列.每个数字最终会被添加两次并减去两次,所以这一切都会被取消.