Java模拟双色球开奖的几种方式

363 阅读2分钟

​​本文已参与「新人创作礼」活动,一起开启掘金创作之路。

需求说明

            有没有买过彩票?双色球玩法:开奖情况是33个红球(数字从1-33)出6个(不重复),16个蓝球(数字1-16)随机出1个。如何用java代码模拟一下这个出球过程呢?

实现思路

第一种:java代码

            数组随机取数并删除循环5次

第二种:redis的set结构

            利用redis的数据结构和现有的操作命令完成

当然还有无数种其他的方式

具体实现

方式一:Java数组

step1: 构建红球数组

    /**
     * @Description TODO 构建红色球
     * @Param []
     * @return java.util.ArrayList<java.lang.Integer>
     */
    private static ArrayList<Integer> buildRedArray(){
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 33; i++) {
            list.add(i);
        }
        return list;
    }

step2: 构建蓝球数组

    /**
     * @Description TODO 构建蓝色球
     * @Param []
     * @return java.util.ArrayList<java.lang.Integer>
     */
    private static ArrayList<Integer> buildBlueArray(){
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 16; i++) {
            list.add(i);
        }
        return list;
    }

step3:出球方法

    /**
     * @Description TODO 取哪个下标(出球方法)
     * @Param [java.util.ArrayList<java.lang.Integer>] 一个数组
     * @return int 下标
     */
    private static int popBall(ArrayList<Integer> list){
        Random random = new Random();
        int index= random.nextInt(list.size()) ;
        return index;
    }

step4:已出的球构建成一个集合

    /**
     * @Description TODO 构建集合收集一下出来的球,再打印出来方便查看
     */
    private static void result(){
        //构建红球数组
        ArrayList<Integer> newRedList = buildRedArray();
        //构建红球已出球空集合
        ArrayList<Integer>  winningNumbersList = new ArrayList<>();
        //每出一个球集合里就把这个球剔除掉,集合剩下的元素继续随机出
        for (int i = 0; i < 6; i++) {
            int winningBallIndex = popBall(newRedList);
            winningNumbersList.add(newRedList.get(winningBallIndex));
            newRedList.remove(winningBallIndex);
        }
        //对结果集进行排序
        Collections.sort(winningNumbersList);
        System.out.println("红色中奖号码="+winningNumbersList);
        
        //蓝色球只需一次
        ArrayList<Integer> newBlueList = buildBlueArray();
        Integer integer = newBlueList.get(popBall(newBlueList));
        System.out.println("蓝色中奖号码="+integer);
    }

step5:调用方法执行

    /**
     * @Description TODO 执行一下!随机五组,凑十块钱的!
     */
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println("第"+(i+1)+"组");
            result();
            System.out.println("-------------------------");
        }
    }

方式二:Redis的set结构模拟

step1:构建红球

sadd red 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

step2:随机出6红球

srandmember red 6

step3:同样办法再出1个蓝球

sadd blue 1 2 3 4 5 6 
srandmember blue 1

当然redis抽奖模型都是类似这种方式实现