黑马程序员技术交流社区

标题: 发现老师的代码有bug 只能用笨办法 [打印本页]

作者: DreamBoyMrsLin    时间: 2017-3-26 22:37
标题: 发现老师的代码有bug 只能用笨办法
需求:1.返回一个存储10个4位数的随机整数 1000-9999的数组(注意思考怎么产生一个4位的随机整数)(不能重  复)
        2.在方法中遍历这个随机数数组       
老师源代码
(import java.util.Random;
public class Demo{
        public static void main(String[] args){
            int[] arr = method();
                for(int i = 0; i < arr.length; i++){
                        System.out.println(arr[i]);
                }
        }
        public static int[] method(){
                Random r = new Random();
                int[] arr = new int[10];
                int i = 0;
                while(i < 10){
                        int num = r.nextInt(9000)+1000;
                        for(int j = 0 ; j < arr.length; j++){
                                if(num == arr[i]){
                                        break;
                                }
                        }
                        arr[i]=num;
                        i++;
                }
                return arr;
        }
})
输出结果:3285 6013 7157 2983 5565 1587 3136 6060 3286 8456
我先不把随机数调这么大  只要限定0到9的随机数即可,原来基础上把数字调小
源码
(import java.util.Random;
public class Test_02 {

        public static void main(String[] args) {
               
                            int[] arr = method();
                                for(int i = 0; i < arr.length; i++){
                                        System.out.print(arr[i]+" ");
                                }
                        }
                        public static int[] method(){
                                Random r = new Random();
                                int[] arr = new int[10];
                                int i = 0;
                                while(i < 10){
                                        int num = r.nextInt(10);
                                        for(int j = 0 ; j < arr.length; j++){
                                                if(num == arr[i]){
                                                        break;
                                                }
                                        }
                                        arr[i]=num;
                                        i++;
                                }
                                return arr;
                        }

})
输出结果:(0     7    6     3    1    0    3    7    1    1 )

然后自己想了很久  只能用笨方法来做  还望大神有更好的方法
源码如下:
(public class Test_01 {
        public static void main(String[] args) {
                Random r = new Random();
                int[] arr = new int[10];
                int temp = 0 ;
                int a = 0;
                for (int i = 0; i < 50; i++) {
                         temp = r.nextInt(10) ;
                         if(arr[0] != temp&&arr[0+1]!=temp && arr[0+2]!=temp&&arr[0+3]!=temp&&arr[0+4]!=temp&&arr[0+5]!=temp&&arr[0+6]!=temp&&arr[0+7]!=temp&&arr[0+8]!=temp&&arr[0+9]!=temp){
                                 arr[a]= temp;
                                 a++;
                                 if(a==9){
                                         break;
                                 }
                         }
                }
                bianli(arr);
               
        }
        public static void bianli(int[] arr){
                System.out.print("数组是:");
                for (int i = 0; i < arr.length; i++) {
                        System.out.print(arr[i]+" ");
                }
                System.out.println();
        }

}

输出结果:2      6      3       8       9         1       7        5         4       0


作者: leijia    时间: 2017-3-26 22:51
挺不错的!一道题可以有很多种做法!
作者: DreamBoyMrsLin    时间: 2017-3-26 22:54
如果是错误的算法有成千上万种,但是输出正确的我所学的知识就只有这种了,想了老久了所以就想发帖问一下  有什么方法能不用这么笨的
作者: javaeeheima    时间: 2017-3-26 23:07
这个你想问什么??

作者: javaeeheima    时间: 2017-3-26 23:10
你和你老师写的代码都错了吧,这个应该是if(num==arr[j])吧


作者: yuanpeng    时间: 2017-3-26 23:15
代码写对了么?num应该于arr【j】做判断吧,而且后面代码应该放到循环里面

作者: DreamBoyMrsLin    时间: 2017-3-26 23:29
D:\1.png
作者: DreamBoyMrsLin    时间: 2017-3-26 23:30
javaeeheima 发表于 2017-3-26 23:10
你和你老师写的代码都错了吧,这个应该是if(num==arr[j])吧

不对 输出结果还是有重复的
作者: DreamBoyMrsLin    时间: 2017-3-26 23:32
javaeeheima 发表于 2017-3-26 23:10
你和你老师写的代码都错了吧,这个应该是if(num==arr[j])吧

不对!输出结果还是有重复的
作者: DreamBoyMrsLin    时间: 2017-3-26 23:33
yuanpeng 发表于 2017-3-26 23:15
代码写对了么?num应该于arr【j】做判断吧,而且后面代码应该放到循环里面
...

你说的是for循环吗?我放了  还是一样  输出的结果还是会有一样的  
作者: DreamBoyMrsLin    时间: 2017-3-26 23:35
javaeeheima 发表于 2017-3-26 23:07
这个你想问什么??

想问  除了笨方法  还有什么其他的方法能做吗?  老师代码肯定是错了  输出结果肯定是会有一样的  
作者: DreamBoyMrsLin    时间: 2017-3-26 23:36
leijia 发表于 2017-3-26 22:51
挺不错的!一道题可以有很多种做法!


如果是错误的算法有成千上万种,但是输出正确的我所学的知识就只有这种了,想了老久了所以就想发帖问一下  有什么方法能不用这么笨的
作者: javaeeheima    时间: 2017-3-26 23:49
有,就是在用循环的时候加上标号,执行break的时候加上标号,直接跳出外循环

作者: DreamBoyMrsLin    时间: 2017-3-27 00:04
想到了   是集合  
作者: javaeeheima    时间: 2017-3-27 00:05
(import java.util.Random;
public class Test_02 {

        public static void main(String[] args) {
               
                            int[] arr = method();
                                for(int i = 0; i < arr.length; i++){
                                        System.out.print(arr[i]+" ");
                                }
                        }
                        public static int[] method(){
                                Random r = new Random();
                                int[] arr = new int[10];
                                int i = 0;
                                while(i < 10){
                                        int num = r.nextInt(10);
boolean pd=true;
                                        for(int j = 0 ; j < arr.length; j++){
                                                if(num == arr[j]){
               pd=false;                                       
break;
                                                }
                                        }
if(pd=false){
break;}
else{
                                        arr[i]=num;
                                        i++;
}
                                }
                                return arr;
                        }

})


作者: javaeeheima    时间: 2017-3-27 00:09
(import java.util.Random;
public class Test_02 {

        public static void main(String[] args) {
               
                            int[] arr = method();
                                for(int i = 0; i < arr.length; i++){
                                        System.out.print(arr[i]+" ");
                                }
                        }
                        public static int[] method(){
                                Random r = new Random();
                                int[] arr = new int[10];
                                int i = 0;
                                while(i < 10){
                                        int num = r.nextInt(10);
boolean pd=true;
                                        for(int j = 0 ; j < arr.length; j++){
                                                if(num == arr[j]){
               pd=false;                                       
break;
                                                }
                                        }
if(pd=false){
continue;}
else{
                                        arr[i]=num;
                                        i++;
}
                                }
                                return arr;
                        }

})

作者: 土豪金    时间: 2017-3-27 00:16
赞一个!
作者: DreamBoyMrsLin    时间: 2017-3-27 00:25
javaeeheima 发表于 2017-3-27 00:09
(import java.util.Random;
public class Test_02 {

我也刚想到了  还可以用集合  和双重for循环和  一个while循环和for循环

作者: DreamBoyMrsLin    时间: 2017-3-27 00:25
土豪金 发表于 2017-3-27 00:16
赞一个!

谢谢
作者: newu    时间: 2017-3-27 07:31
好帖,赞一个,顶楼主

作者: 土豪金    时间: 2017-3-27 12:28
DreamBoyMrsLin 发表于 2017-3-27 00:25
谢谢



作者: 若梦蓝山悠长    时间: 2017-3-27 17:20
厉害了我的哥,老师的代码都找出错误了,老师可是月薪5w的

作者: 精诚所至    时间: 2017-3-27 19:41
这是我写的可以看一下
[Java] 纯文本查看 复制代码
package homework;

import java.util.Random;

/*需求:1.返回一个存储10个4位数的随机整数 1000-9999的数组(注意思考怎么产生一个4位的随机整数)(不能重  复)
2.在方法中遍历这个随机数数组    */   
public class Test09 {
        public static void main(String[] args) {
                //定义一个数组
                int[] arr = new int[10];
               
                Random r = new Random();
                arr[0] = r.nextInt(9000) + 1000;
                for (int i = 1; i < arr.length; i++) {
                        //遍历数组为每个元素赋值
                        //定义一个标记是否前面出现过
                        boolean flag = false;
                        while (true) {
                                arr = r.nextInt(9000) + 1000;
                                //遍历比i小的索引,判断是否有和arr相同的元素
                                for (int j = 0; j < i; j++) {
                                        if (arr[j] == arr) {
                                                flag = true;
                                                break;
                                        }
                                }
                                if (!flag) {
                                        break;
                                }
                        }                       
                }
                //遍历数组
                for (int i = 0; i < arr.length; i++) {
                        System.out.println(arr);
                }
        }
}



作者: 郝永    时间: 2017-4-12 22:54

public class Test03 {
        public static void main(String[] args) {
                Random r = new Random();
                ArrayList<Integer> list = new ArrayList<>();
                int i=0;
                while(list.size()<10){
                        int a = r.nextInt(9000)+1000;
                        if(!list.contains(a)){
                                list.add(a);
                        }else{
                                i--;
                        }
                        i++;
                }
                System.out.println(list);
        }

}看看,交流一下,是这么着吗?
作者: 郝永    时间: 2017-4-12 23:03

import java.util.ArrayList;
import java.util.Random;

/*
需求:1.返回一个存储10个4位数的随机整数 1000-9999的数组(注意思考怎么产生一个4位的随机整数)(不能重  复)
        2.在方法中遍历这个随机数数组    */
public class Test03 {
        public static void main(String[] args) {
                int [] arr = math();
                for (int i : arr) {
                        System.out.println(i);
                }
               
        }
        public static int [] math(){
        Random r = new Random();
        ArrayList<Integer> list = new ArrayList<>();
        int i=0;
        while(list.size()<10){
                int a = r.nextInt(9000)+1000;
                if(!list.contains(a)){
                        list.add(a);
                }else{
                        i--;
                }
                i++;
        }
        int [] arr = new int [10];
        for (int j = 0; j < list.size(); j++) {
                arr[j] = list.get(j);
        }
        return arr;

        }
}
这样应该更符合题意,其实我就想蹭点技术分
作者: DreamBoyMrsLin    时间: 2017-4-12 23:33
郝永 发表于 2017-4-12 23:03
import java.util.ArrayList;
import java.util.Random;

你这样真的好吗?老同学  
作者: DreamBoyMrsLin    时间: 2017-4-12 23:35
郝永 发表于 2017-4-12 22:54
public class Test03 {
        public static void main(String[] args) {
                Random r = new Random();

public class Test03 {
        public static void main(String[] args) {
                Random r = new Random();
                ArrayList<Integer> list = new ArrayList<>();
                int i=0;
                while(list.size()<10){
                        int a = r.nextInt(9000)+1000;
                        if(!list.contains(a)){
                                list.add(a);
                                   i++;
                        }
                       
                }
                System.out.println(list);
        }
这样做也可以  可以省一句代码 这道题主要考的是思路
作者: 越雪    时间: 2017-4-12 23:41
楼主厉害了,赞一个!!!涨知识了!!!

作者: 郝永    时间: 2017-4-14 22:01
DreamBoyMrsLin 发表于 2017-4-12 23:35
public class Test03 {
        public static void main(String[] args) {
                Random r =  ...

我发现这个变量i是不是没用?
作者: DreamBoyMrsLin    时间: 2017-4-14 23:51
郝永 发表于 2017-4-14 22:01
我发现这个变量i是不是没用?

这个变量i有用呀
作者: 郝永    时间: 2017-4-15 10:05

你删除试试
作者: 范德华丽    时间: 2017-5-3 23:23
哈哈,我表示自己写代码很爽,如果看别人写的代码很痛苦,这道题不难,我讲下我的做法,最外层是个for循环,来填十个数,再内一层,用while循环,来判断随机生成的数和数组中不重复再进行填下一个数,如果重复就无线循环随机生成,再内层就是随机生成,其实思路有了就好说





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