知识点14:数组内存储1-100的不重复随机数问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dengminghli/article/details/76767742

问题描述:在一个长度为100的数组里随机插入100个1-100内的随机数,要求随机数不能重复,并且不能使用其他类型的数据结构。仅可以使用数组完成。
解法1:

/**
 * 解题思路:
 * 随机生成1-100里面的数字z
 * .
 * 判断是否在数组里面存活
 * 如果存活,则抛弃
 * 如果不存活,添加进数组中
 * 问题:效率不高
 * 推荐指数:**
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int count =0;
        do {
            int randomNumber = new Random().nextInt(100)+1;
            if (!isAlive(randomNumber,arrays)) {
                arrays[count++] = randomNumber;
            }
        } while (!(count == arrays.length));

    }
/*
*判断是否存在
*/
    static boolean isAlive(int number,int[] arrays){
        boolean isAlive = false;
        for (int i = 0; i < arrays.length; i++) {
            if (number == arrays[i]) {
                isAlive = true;
            }
        }
        return isAlive;
    }

这个解法应该是符合普遍人的思路了,只是这样的话会造成一个问题:当数组内的随机数越多的时候,重复的几率就会扩大,也就是需要生成更多的随机数,这使得效率十分低下,是故不推荐。但如果是在想不起其他优化的话,还是可以先参照的。下面是优化解法:

解法2:

/**
 * 解题思路:
    在一长度为100数组中,依次存入1-100的数字
    随机选取一个下标,将其存储的值与最后一个值交换
    把数组的最后一个值加入到数组中,改变下一次随机下标取值范围(-1)
    避免了重复数字的出现,避免了多次的循环判断监测,优化效率,但增加内存
 * 推荐指数:***
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int datalength=100;
        int[] data = new int[datalength];
        for (int i = 0; i < data.length; i++) {
            data[i] = i+1;
        }
        int count = 0;
        do{
            int  rand =new Random().nextInt(datalength--);
            int tmp=data[rand];
            data[rand] = data[datalength];
            data[datalength] = tmp;
            arrays[count++] = data[datalength];
        }while(count != arrays.length);
    }
}

这个算法极大程度上优化了效率问题,但也增加了内存。虽然这个内存不算很致命。但总的来说,还有可以优化的地方。
解法3:

/**
 * 优化思路:
    在数组内直接存放1-100的随机数,随机生成下标,将下标数值得数与可生成随机数的最大值进行交换,然后缩减随机数范围(-1)
    既不新增内存,也优化了效率
 * 推荐指数:****
 * */
    private static void putRandomNumberIntoArrays(int[] arrays) {
        int datalength =arrays.length;
        for (int i = 0; i < arrays.length; i++) {
            arrays[i]= i+1;
        }
        do{
            int  rand =new Random().nextInt(datalength--);
            int tmp=arrays[rand];
            arrays[rand] = arrays[datalength];
            arrays[datalength] = tmp;
        }while(datalength>0);
    }
}

这个算法时目前所能想到的最佳的方法了,既不增加内存,也避免了随机值重复的问题。这个和解法2的问题仅限于是否增加一个内存而已,本质上是一致的,可供参考。

猜你喜欢

转载自blog.csdn.net/dengminghli/article/details/76767742