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

时间:2013-06-22 15:34:58

标签: java arrays sorting random

如果数组填充如下:

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);

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

我无法想象伪随机性真的会有缺陷。这是怎么回事?

2 个答案:

答案 0 :(得分:8)

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

让我们以数学方式证明这一点。假设我们有一个包含四个元素的数组:[A, B, C, D]。 (这些数值并不重要,我会证明这一点。)

每次循环:

  • i = 0sum += A + D。 Sum现在是A + D
  • i = 1sum -= B + C。 Sum现在是(A + D) - (B + C)
  • i = 2sum += C + B。 Sum现在是(A + D) - (B + C) + (C + B)
  • i = 3sum -= 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];

你尝试过任何不均匀的长度吗?