A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

有大神指导一下吗,想了好久都不懂错哪里了,就是还有重复喔,谢谢啦么么哒
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]);
        }
       
       
        }

}

评分

参与人数 1黑马币 +2 收起 理由
你是我的谁 + 2 有才

查看全部评分

6 个回复

倒序浏览
这个判断方法在判断到第三个元素时就力不从心了,建议由外面for循环来产生随机数,内部for循环来判断重复。
回复 使用道具 举报
找起问题比较伤脑筋。
        假设此时,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};
回复 使用道具 举报
黎明如约而至 发表于 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:50
非常感谢阿大神,想了好久没想出来。现在把j--改成j=0。可以了么么哒

不行,好吧,我错了,再想想
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
本帖最后由 黎明如约而至 于 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);

                }
        }
}


回复 使用道具 举报
黎明如约而至 发表于 2017-5-30 18:05
我也是新手,写代码有点啰嗦,我把程序改了下,你再优化吧

谢谢啦,我把j--改成j=-1就可以,刚才改成0少了个j=0的判断,所以不行,现在可以啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马