黑马程序员技术交流社区

标题: 关于循环中避免获取重复随机数的解决思路 [打印本页]

作者: 做有梦想的咸鱼    时间: 2018-4-17 22:30
标题: 关于循环中避免获取重复随机数的解决思路
需求:
1.定义main方法,方法内完成:
(1)定义长度为26,元素值为26个大写英文字母的数组chs
(2)创建方法getStr(),并传递数组(getStr(char[] chs)),获取返回值并打印。
返回值内容:在方法getStr(char[] chs)中,随机从chs中获取4个大写字母,然后和一个0到9之间的整数组成一个长度为5的字符串。类似于:QWRE9  EXDL8等数字----字母和数字都是随机的。

正常来说只需要在循环中获取随机数就行了,但是强迫症表示从数组中随机获取4个大写字母不应该出现重复的结果,问题在于随机数是可能出现重复的,于是需要多写一个方法来判断是否有重复的随机数。
public static boolean panDuan(int[] arr,int a){//判断是否重复
                for(int i=0;i<arr.length;i++){
                        if(arr[i]==a){
                                return  false;
                        }
                }
                return true;
        }
完成这个方法后又出现新的问题,那就是这个方法是用在循环中,当真的出现重复的随机数时,虽然避免了获取重复的大写字母,但循环次数却减少了一次导致循环次数不够,这时候需要在循环嵌套的判断语句中加入--来回复循环次数。最终结果为:
public class myTest {
        public static void main(String[] args) {
                char[] chs = new char[26];
                int count = 65;
                for(int x=0;x<chs.length;x++){
                        chs[x] = (char)count;
                        count++;
                }
                print(chs);
                String str = getStr(chs);
                System.out.println(str);
        }
        public static void print(char[] arr){
                System.out.print("[");
                for(int x=0;x<arr.length;x++){
                        if(x==arr.length-1){
                                System.out.println(arr[x]+"]");
                        }else{
                                System.out.print(arr[x]+",");
                        }
                }
        }
        public static String getStr(char[] arr){
                Random r = new Random();
                char[] chs = new char[4];
                int[] chong ={26,26,26,26};
                for(int x=0;x<chs.length;x++){
                        int a = r.nextInt(26);
                        if(panDuan(chong, a)){
                                chong[x] = a;
                                chs[x] = arr[a];
                        }else {
                                x--;
                        }
                }
                StringBuilder sb = new StringBuilder();
                int b = r.nextInt(10);
                sb.append(chs).append(b);
                String str = sb.toString();
                return str;
        }
        public static boolean panDuan(int[] arr,int a){//判断是否重复
                for(int i=0;i<arr.length;i++){
                        if(arr[i]==a){
                                return  false;
                        }
                }
                return true;
        }
}
作者: cj1234    时间: 2018-4-18 10:47
技术是要敲出来的,多敲多思考,加油




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