DESKTOP-TEACTL5_20200909-曾越

问题:

重新看上次写的大乐透的代码时,发现了一个不影响结果但是很多余的代码缺陷:

private static int[] choose(int n, int area){

    int[] array = new int[n];
    Random r = new Random();

    for (int i = 0; i < n; i++) {
        array[i] = r.nextInt(area) + 1;

        if (i >= 1) {//刚产生第一个数array[0]时不需要作比较
            for (int j = i; j > 0; j--) {// 确保每个区不会产生重复的数
                if (array[i] == array[j - 1]) {

                    i--;

                }
            }
        }

    }

    return array;

}

在for循环中用新产生的随机数与之前已有的随机数进行比较时,当找到这样一个与新产生的随机数相等时,执行i--;这时如果j的值没有减到1,依旧会执行。由于每产生一个新的随机数都会先判断该随机数是否与之前的重复,所以即使j会继续减小到1并与array[i]做比较,但因为不会再碰到一个重复的随机数,故不会再执行i--操作,也就是进行了不必要的比较。应该在i--之后加上break;这样第一次找到重复的随机数之后,i--了立即结束for循环然后继续产生下一个随机数。

吐槽:

教室里在我头正上方的管子漏水!每过几分钟就正正好好滴在我脑壳上。