黑马程序员技术交流社区

标题: 昨天老师讲解了一道题后想用自己的方法做一次,结果失败了 [打印本页]

作者: Nico-Hymmm    时间: 2017-5-30 15:38
标题: 昨天老师讲解了一道题后想用自己的方法做一次,结果失败了
有大神指导一下吗,想了好久都不懂错哪里了,就是还有重复喔,谢谢啦么么哒
import java.util.Random;

public class Test1 {

        public static void main(String[] args) {
                // 使用random类随机6个1到33的红球(不重复)和1个1到16的蓝球(模拟双色球彩票)
                Random r = new Random();
                //定义一个数组装球
                int[] arr = new int[7];
                //判断是否有重复,有重复就重新随机取值,无重复就将数值存入数组中
               
                for (int i = 0; i < arr.length-1; i++) {
                        int a = r.nextInt(33)+1;
                        for (int j = 0; j < i; j++) {
                                if(a == arr[j]){
                                        a = r.nextInt(33)+1;
                                        j--;
                                }
                        }
                        arr[i] = a;                       
                }
                arr[arr.length-1] = r.nextInt(16)+1;
        for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
        }
       
       
        }

}
作者: 黎明如约而至    时间: 2017-5-30 17:12
这个判断方法在判断到第三个元素时就力不从心了,建议由外面for循环来产生随机数,内部for循环来判断重复。
作者: 黎明如约而至    时间: 2017-5-30 17:16
找起问题比较伤脑筋。
        假设此时,arr = {15,26,0,0,0,0,0}; 且循环至i==3,j==2时,
        外部随机数a=26, 26 == arr[2], 进入 if 语句,新的随机数 a=15,
        然后 j--,j++,j 的值仍然为2,再次循环,
        由于 (15 != arr[2]) ,所以 j++,j 等于3循环结束;
        执行语句arr = a;即 arr[3] = 15;
        此时的arr = {15,26,15,0,0,0,0};

作者: Nico-Hymmm    时间: 2017-5-30 17:50
黎明如约而至 发表于 2017-5-30 17:16
找起问题比较伤脑筋。
        假设此时,arr = {15,26,0,0,0,0,0}; 且循环至i==3,j==2时,
        外部随机数a=26, 26 == ...

非常感谢阿大神,想了好久没想出来。现在把j--改成j=0。可以了么么哒

作者: Nico-Hymmm    时间: 2017-5-30 17:52
Nico-Hymmm 发表于 2017-5-30 17:50
非常感谢阿大神,想了好久没想出来。现在把j--改成j=0。可以了么么哒

不行,好吧,我错了,再想想

作者: 黎明如约而至    时间: 2017-5-30 18:05
本帖最后由 黎明如约而至 于 2017-5-30 18:10 编辑

我也是新手,写代码有点啰嗦,我把程序改了下,你再优化吧


import java.util.Random;

public class Test1 {

        public static void main(String[] args) {

                // 使用random类随机6个1到33的红球(不重复)和1个1到16的蓝球(模拟双色球彩票)

                Random r = new Random();

                // 定义一个数组装球
                int[] arr = new int[7];

                // 生成随机数;
                for (int i = 0; i < arr.length - 1; i++) {
                        
                        // 用来标记是否存在重复,并重置为true;
                        boolean result = true;
                        int a = r.nextInt(6) + 1;

                        // 判断是否重复;
                        for (int j = 0; j < i; j++) {
                                // 若发现重复,把result标记为false;结束该循环;
                                if (a == arr[j]) {
                                        result = false;                                        break;
                                }
                        }
                        // 判断结束且无重复,再赋值,否则i--,重新生成随机数;
                        if (result) {
                                arr = a;
                        } else {
                                i--;
                        }
                }

                arr[arr.length - 1] = r.nextInt(16) + 1;

                for (int i = 0; i < arr.length; i++) {

                        System.out.println(arr);

                }
        }
}



作者: Nico-Hymmm    时间: 2017-5-30 18:29
黎明如约而至 发表于 2017-5-30 18:05
我也是新手,写代码有点啰嗦,我把程序改了下,你再优化吧

谢谢啦,我把j--改成j=-1就可以,刚才改成0少了个j=0的判断,所以不行,现在可以啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2