JAVA随机数对于抽奖,班级点名代码实现与原理

JAVA随机数对于抽奖,班级点名代码实现与原理

直接上需求:要求编写程序,生成5个不重复的随机数。重复的话重新生成。
最终生成的5个随机数放到数组中,要求数组中这5个随机数不重复。

最近学习了Random,以下代码用到了数组、生成随机数等知识。首先我们最关键的是要解决生成的随机数如何跟数组当中的元素进行对比,并且当两个值相等的时候继续生成随机数,直到生成的五个随机数跟数组中的元素不相同的时候输出。

先整理了一个简单的思路,便于理解。

    1、创建Random 对象
    2、给定一个容量为5的int数组,因为动态创建的一维数组默认值都是0,但是随机生成[0~100],也可能生成0,没有办法区分随机生成的0和一维数组当中的0,所以遍历一维数组并赋值为200.
    3、int index=0;
    while (结束条件是:当index大于数组长度){
         创建0-100之间的随机数
        if (随机产生的数不等于数组里面的数,或者说arr数组中不含有这个num){
            把这个num放到index下标的数组当中
            下标加1,下次产生随机数,就可以放到index+1下标的位置上
        }
   4、给定一个方法去判断产生的随机数是否与数组当中的元素相等。
   方法一 是采用数组排序,然后经过二分查找的方式实现。但是方法一有一个逻辑上的BUG,给定一个初始化容量为5的一维数组,思考当赋值为-1的时候会产生什么后果?答案是当一维数组默认值给-1的时候,当产生一位随机数放进一维数组的时候回对数组进行排序,产生的随机数就会被排序放到一维数组的最后一位,而数组下标为0的元素还是-1,此时已经进行了index++操作,就是说下一次产生的随机数就被放到了下标为1的数组元素上面去了,而下标为0的元素始终是-1,这与我们的初衷是违背的所以就有了方法二。
   方法二 遍历数组,下标为index上的元素如果等于随机产生的数字返回true,不等则false。

方法一代码如下:

public class RandomTest021 {
    
    
    public static void main(String[] args) {
    
    
        //创建 Random 对象
        Random random=new Random();
        //给定一个容量为5的int数组

        int[] arr=new int[5];
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i]=200;
        }
        int index=0;
        while (index< arr.length){
    
    
            //生成随机数
            int num= random.nextInt(101);
            //调用方法,判断当数组arr不包含num随机数的时候,把num放到arr数组当中
            if (!contains(arr,num)){
    
    
                //把num放到arr数组当中
                arr[index]=num;
                index++;
            }
        }
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i]);
        }
    }
    /**
     * 提供一个随机数跟数组中的数字进行比较的方法。
     * @param arr 数组
     * @param key 随机数
     * @return 返回true代表包含,返回false代表不包含
     */
    public static boolean contains(int[] arr,int key){
    
    
        //对数组进行排序
        Arrays.sort(arr);
        //进行二分法查找
        //如果没找到就返回-1,找到的话返回对应元素下标
        return  Arrays.binarySearch(arr,key)>=0;
    }
}

当一维数组默认值给到-1的时候会产生以下bug
效果如下:
在这里插入图片描述

方法二代码如下:

public class RandomTest02 {
    
    
    public static void main(String[] args) {
    
    
        Random random=new Random();
        int[] arr=new int[5];
        for (int i = 0; i < arr.length; i++) {
    
    
            arr[i]=-1;
        }
        int index=0;
        while (index< arr.length){
    
    
            int num=random.nextInt(5);
            if (!contains(arr,num)){
    
    
                arr[index]=num;
                index++;
            }
        }
        for (int i = 0; i < arr.length; i++) {
    
    
            System.out.println(arr[i]);
        }

        }
        public static boolean contains(int[] arr,int key){
    
    
            for (int i = 0; i < arr.length; i++) {
    
    
                if (arr[i]==key){
    
    
                    return true;
                }
            }
            return false;
        }

    }

运行结果如下:
这样运用随机数加上一个数组,简单的抽奖或者点名系统的雏形就好啦!在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_54794309/article/details/113920046