【无标题】抽奖问题

现有一个装着红包的奖金池,设计一个方法模拟抽奖,要求如下:
打印出每个奖项,奖项的出现顺序随机且不重复。

//奖项出现顺序不重复,也就是说每个奖项出现的概率相等
 public static void main(String[] args) {
        String[] s = {"一等奖","二等奖","三等奖","四等奖","五等奖","六等奖",};
        lottery0(s);
    }

方法1:使用两个数组,用一个数组来存储奖项,用另外一个数组来存储访问状态,
当访问状态数组到某个下标时,将这个值设置为false,作标记,当它为alse时,说明已经找到过了,不再输出。

public static void lottery0(String[] arr){
        if (arr.length==0||arr==null){//当数组有意义才进行操作
            return;
        }
        int L = arr.length;//用来记录数组的长度,用来获得随机数的范围
        boolean[] b = new boolean[L];//用来标记对应数组的状态(是否被访问)
        Arrays.fill(b,true);//给boolean数组全都填充为true值
        int count = 0;//判断已经中奖的个数
        Random random = new Random();
        while (count<L){//当中奖数等于L时,说明已经把所有奖项都遍历完了。
            int i = random.nextInt(L);//随机生成数
            if(b[i]){//判断数组对应的状态,如果为true则没有被访问,进行访问,如何将它设置为false,这样就不会再访问了
                System.out.println(arr[i]);
                b[i]=false;
                count++;
            }
        }

    }

方法2:用数组来存储奖项,当访问到某个下标时,将这个值设置为0,作标记,当我们访问的值是0时,重新寻找。

public static void lottery1(String[] arr){
        if (arr.length==0||arr==null){//当数组有意义才进行操作
            return;
        }
        Random random = new Random();
        int L = arr.length;//用来记录数组的长度,用来获得随机数的范围
        int count = 0;//判断已经中奖的个数
        while(count<L){//当中奖数等于L时,说明已经把所有奖项都遍历完了。
            int i = random.nextInt(L);//获取随机数,也就是随机获取数组的下标值
            if (arr[i]!=null){//当数组不为空,就输出这个值,并且count++
                count++;
                System.out.println("恭喜获得奖项:"+arr[i]);
                arr[i] = null;//标记这个值为null,说明i下标的值已经被抽中了,不会再被重复抽。
            }
        }

    }

方法三:用一个容器来存储每一个奖项的值,当找到找到这个值时,就从容器中删除,我们这里用map集合

 public static void lottery2(String[] arr){
        if (arr.length==0||arr==null){//当数组有意义才进行操作
            return;
        }
        Map<Integer, String> sm = new HashMap<Integer, String>();//设置map集合来村粗数据
        Random random = new Random();
        int L = arr.length;
        for (int i = 0; i < arr.length; i++) {//将数组中的数据都放到集合中
            sm.put(i,arr[i]);
        }
        while(!sm.isEmpty()){//当集合中还有值,则继续循环
            int i = random.nextInt(L);//获取随机数,也就是随机获取HashMap的键值
            if (sm.get(i)!=null){//当值不为空才输出
                System.out.println("恭喜获得奖项:"+sm.get(i));
                sm.remove(i);//输出之后就从集合中删掉,避免重复输出
            }

        }
    }

拓展== 考虑到现实生活中有时候不可能所有奖项被抽中的概率一样大,所以我们修改一下题目(奖项可以重复)
假设一等奖1个,二等奖2个,三等奖3个,四等奖4个,依次类推

public static void lottery4(String[] arr){
        if (arr.length==0||arr==null){//当数组有意义才进行操作
            return;
        }
        int L = arr.length;//用来记录数组的长度,用来获得随机数的范围
        int[] arr2 = {1,2,3,4,5,6};//设置奖项对应的个数
        int sum = 0;//用来记录一共有多少个奖数
        for (int i = 0; i < arr2.length; i++) {
            sum+=arr2[i];//求各种奖加起来的数目
        }
        int count = 0;//判断已经中奖的个数
        Random random = new Random();
        while (count<sum){//当中奖数等于sum时,说明已经把所有奖项都遍历完了。
            int i = random.nextInt(L);//随机生成数
            if(arr2[i]>0){//当arr2中对应下标的值已经大于0时,说明这个奖项还没有被全部抽完
                System.out.print(arr[i]+" ");
                arr2[i]--;//抽中一次,则这个奖的个数减一
                count++;//已经被抽中的奖的数目加一
            }
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值