如果数组填充如下:
for (int i = 0; i < rand.length; i++) {
rand[i] = (int) Math.round(Math.random() * 1000000) + 1;
}
然后使用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);
然后总和将始终为零。这已经证明了我已经测试过它的一百次左右。尝试任何范围,任何数组长度。
我无法想象伪随机性真的会有缺陷。这是怎么回事?
答案 0 :(得分:8)
随机数生成器提供的数字无关紧要。只要数组具有偶数长度,使用该函数计算的总和将始终为零。
让我们以数学方式证明这一点。假设我们有一个包含四个元素的数组:[A, B, C, D]
。 (这些数值并不重要,我会证明这一点。)
每次循环:
i = 0
:sum += A + D
。 Sum现在是A + D
。i = 1
:sum -= B + C
。 Sum现在是(A + D) - (B + C)
。i = 2
:sum += C + B
。 Sum现在是(A + D) - (B + C) + (C + B)
i = 3
:sum -= D + A
。 Sum现在是(A + D) - (B + C) + (C + B) - (D + A)
。如果我们展开这个,我们会得到A + D - B - C + C + B - D - A
。一切都取消了;结果为零。总是
同样的原则适用于任何偶数长度数组。每个号码最终都会被添加两次并减去两次,所以这一切都会被取消。
答案 1 :(得分:4)
如果长度是偶数,则将所有数字加一次并减去所有数字 - 当然,结果为0.
length==6
的示例:
/*i==0*/ sum += rand[0] + rand[5];
/*i==1*/ sum -= rand[1] + rand[4];
/*i==2*/ sum += rand[2] + rand[3];
/*i==3*/ sum -= rand[3] + rand[2];
/*i==4*/ sum += rand[4] + rand[1];
/*i==5*/ sum -= rand[5] + rand[0];
你尝试过任何不均匀的长度吗?