You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java归并排序基准测试实现及随机数数组重复问题排查

问题原因与修复方案

为什么数组全是相同的随机数?

你用了Arrays.fill(a, rnd.nextInt()),这个方法的作用是把数组所有元素都设置成传入的同一个值。每次调用它,都会生成一个随机数,然后把整个数组的10个元素全部替换成这个数。再加上你嵌套了两层循环(外层1000次、内层10000次),每次内层循环都会重新把数组覆盖成新的随机数,最后数组里的所有元素就是最后一次调用Arrays.fill时生成的那个随机数,自然全是一样的。

正确的随机数组填充方式

要给数组每个元素生成不同的随机数,应该遍历数组的每个索引,逐个赋值:

for (int i = 0; i < a.length; i++) {
    a[i] = rnd.nextInt();
}

基准测试逻辑的优化建议

现在的代码循环了上万次填充数组,但最后只对最后一次填充的数组做了一次排序,完全达不到基准测试的目的——基准测试需要多次执行排序操作,统计平均耗时来避免偶然性。调整后的逻辑参考:

int arraySize = 10;
int testTimes = 1000; // 测试次数
Random rnd = new Random();
MergeSort m1 = new MergeSort();

long totalTime = 0;

for (int j = 0; j < testTimes; j++) {
    // 每次生成新的随机数组
    int[] a = new int[arraySize];
    for (int i = 0; i < a.length; i++) {
        a[i] = rnd.nextInt();
    }
    // 执行排序并计时
    long startTime = System.nanoTime();
    m1.mergeSort(a, 0, a.length - 1);
    long endTime = System.nanoTime();
    totalTime += (endTime - startTime);
}

// 计算平均耗时
long averageTime = totalTime / testTimes;
System.out.println("平均执行时间(纳秒):" + averageTime);
System.out.println("平均执行时间(毫秒):" + averageTime / 1000000);

内容的提问来源于stack exchange,提问作者Javaebeginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:25:30