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

来源:互联网 发布:java分层命名规范 编辑:程序博客网 时间:2024/06/15 18:08

问题描述:在一个长度为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的问题仅限于是否增加一个内存而已,本质上是一致的,可供参考。

原创粉丝点击