填充具有随机数的数组时,Math.random的非随机因子

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)

然后总和将始终为零.这已经证明了我已经测试过它的一百次左右.尝试任何范围,任何数组长度.

我无法想象伪随机性真的会有缺陷.这里发生了什么?

dus*_*uff 8

您的随机数生成器提供的数字无关紧要.只要数组的长度为偶数,使用该函数计算的总和将始终为零.

让我们用数学方法证明这一点.假设我们有四个元素的数组:[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.一切都取消了; 结果为零.总是.

同样的原则适用于任何偶数长度阵列.每个数字最终会被添加两次并减去两次,所以这一切都会被取消.