java - 用随机数填充数组时 Math.random 的非常非随机因子

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

那么总和将永远为零。我已经测试了一百次左右,这已被证明是正确的。尝试任何范围,任何数组长度。

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

最佳答案

无论您的随机数生成器产生什么数字都没有关系。只要您的数组长度为偶数,您使用该函数计算的总和将始终为零。

让我们从数学上证明这一点。假设我们有一个包含四个元素的数组:[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/

相关文章:

java - 从 InputStream 读取非泛型 HashMap 时发出警告

java - Spring AMQP header 仅作为字符串返回

javascript - 如何重复显示数组中的每个元素并在单击按钮时停止

python - 对包含元组 python 的列表列表中的项目进行分组

java - 我无法理解 Merge Sorted Array 的示例测试用例?

java - 让 JDBI 映射自定义查询的结果

java - 加密/解密 - iphone 到 java - BadPaddingException : Given final block not properly padded

php - 解析从 Google 时区 API 返回的 JSON

java - 在 2 个独立的 JTable 中显示不同的数据

PHP 按子集对数组进行排序