如果一个数组是这样填充的:
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);
那么总和将永远为零。我已经测试了一百次左右,这已被证明是正确的。尝试任何范围,任何数组长度。
我无法想象伪随机性真的有那么大的缺陷。这是怎么回事?
最佳答案
无论您的随机数生成器产生什么数字都没有关系。只要您的数组长度为偶数,您使用该函数计算的总和将始终为零。
让我们从数学上证明这一点。假设我们有一个包含四个元素的数组:[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
。一切都抵消了;结果为零。总是。
同样的原则适用于任何偶数长度的数组。每个数字最终都加了两次,减了两次,所以它们都抵消了。
关于java - 用随机数填充数组时 Math.random 的非常非随机因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252384/