彩票抽奖概率


import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

//需求:双色球
public class Demo07 {
    public static void main(String[] args) {
        //int[] arr1 = select();
        //printArr(arr1);

        //中奖号码
        int[] arr1 = auto();

        for (int i = 0; i < 1000; i++) {
            //机选号码
            int[] arr2 = auto();

            //检测
            check(arr2, arr1);
        }
    }

    /**
     * 打印数组中的红球号和蓝球号
     *
     * @param arr 存储有号码的数组
     */
    public static void printArr(int[] arr) {
        //打印数组中双色球号码,也是一个功能,可以使用方法实现
        //将一段代码选中,然后:ctrl + alt + m ,可以把这段代码放到方法中
        System.out.print("红球号:");
        for (int i = 0; i < arr.length - 1; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.print("\t蓝球号:");
        System.out.println(arr[6]);
    }

    /**
     * 1.用户投注。6个红球号(1~33),1个蓝球号(1~16)
     * 明确参数:不需要参数,双色球的规则是固定的!范围和个数都有要求
     * 明确返回值:返回一组号码。int[]。0~5索引放红球号,6索引放蓝球号
     */
    public static int[] select() {
        //1.1 需要得到一个长度为7的int数组。动态初始化
        int[] arr = new int[7];

        //1.2 需要键盘录入号码,创建Scanner
        Scanner sc = new Scanner(System.in);

        //1.3 需要为arr数组中填充号码,先填充红球号,遍历数组。0~5索引
        for (int i = 0; i <= 5; i++) {
            //1.4 提示用户输入红球号
            System.out.println("请输入" + (i + 1) + "个红球号,号码在1~33之间:");
            //1.5 将键盘录入的数据直接给数组i索引位置复制
            arr[i] = sc.nextInt();

            //1.6 赋值之后,i索引位置的数据不一定合理。首先要看范围对不对
            if (arr[i] < 1 || arr[i] > 33) {
                //成立了,此时i索引位置的数据不合理,这个位置的数据需要作废
                System.out.println("亲,红球号必须在1~33之间哦!请重新输入!");
                i--;

                //这个位置已经不合理,直接继续下一次循环即可
                continue;
            }

            //1.7 如果代码能够执行到这,说明continue没有执行。意味着arr[i]范围是合理的!
            //arr[i]这个号码和前面的号码是否重复?
            for (int j = 0; j < i; j++) {
                //判断i索引位置的数据,和j索引位置的数据是否有重复的!
                if (arr[i] == arr[j]) {
                    //成立了,说明i位置的数据和前面的重复了!
                    System.out.println("亲,输入的号码不能重复哦!请重新输入!");
                    i--;
                    break;
                }
            }
        }

        //红球号输入完毕,对红球号进行排序,需要排序的索引是从0号开始到5号结束
        //指定数组特定索引范围的数据排序,格式:Arrays.sort(被排序的数组, 开始索引, 结束索引的后一位)
        Arrays.sort(arr, 0, 6);

        //1.8 输入蓝球号。蓝球号有可能一直输入错误,这是个死循环
        while (true) {
            System.out.println("请输入蓝球号,号码在1~16之间:");
            arr[6] = sc.nextInt();

            //arr[6]这个输入的蓝球号有可能非法,需要判断
            if (arr[6] < 1 || arr[6] > 16) {
                //非法
                System.out.println("亲,蓝球号必须在1~16之间哦!请重新输入!");
            } else {
                //合法。循环需要结束
                break;
            }
        }

        //返回数组
        return arr;
    }

    /**
     * 2.机选号码,随机生成6个不重复的红球号,和一个蓝球号
     * 明确参数:不需要
     * 明确返回值:int[]
     */
    public static int[] auto() {
        //2.1 动态初始化一个长度为7的数组
        int[] arr = new int[7];

        //2.2 随机生成号码,需要使用Random
        Random r = new Random();

        //2.3 遍历0~5索引位置,赋值随机的红球号
        for (int i = 0; i <= 5; i++) {
            //2.4 生成范围是1~33的随机数。给数组i索引位置赋值
            arr[i] = r.nextInt(33) + 1;

            //2.5 i索引位置的数据和前面是否重复?需要遍历判断
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    //成立,说明重复了!
                    i--;
                    //已经发现重复了,这个遍历j的循环可以结束了
                    break;
                }
            }
        }

        //2.6 排个序
        Arrays.sort(arr, 0, 6);

        //2.7 生成随机的蓝球号
        arr[6] = r.nextInt(16) + 1;

        //返回数组
        return arr;
    }

    /**
     * 3.定义方法,判断中奖情况
     * 明确参数:需要抽奖的号码,和中奖的号码
     * 明确返回值:直接打印中奖情况,不需要返回值
     */
    public static void check(int[] myArr, int[] arr) {
        //定义计数器,用来记录红球命中的次数
        int count = 0;

        //4.统计一下红球的命中次数!遍历myArr数组,从0号索引到5号索引
        for (int i = 0; i <= 5; i++) {
            //5.拿出i索引位置的号码(自己的号码)和arr数组中的号码(中奖的号码)比较,有相同的就说明中了一个
            //内层循环遍历中间的数组
            for (int j = 0; j < 5; j++) {
                if (myArr[i] == arr[j]) {
                    //成立,命中了一个!
                    count++;
                }
            }
        }

        //6.考虑蓝球有没有中!
        if (myArr[6] == arr[6]) {
            //命中蓝球
            //使用switch看看count到底匹配几次红球
            switch (count) {
                case 6:
                    System.out.println("一等奖,最高1000万!");
                    break;
                case 5:
                    System.out.println("三等奖,最高3000元!");
                    break;
                case 4:
                    System.out.println("四等奖,200元!");
                    break;
                case 3:
                    System.out.println("五等奖,10元!");
                    break;
                case 0, 1, 2:
                    System.out.println("六等奖,5元!");
                    break;
            }
        } else {
            //未命中蓝球
            switch (count) {
                case 6:
                    System.out.println("二等奖,最高500万!");
                    break;
                case 5:
                    System.out.println("四等奖,200元!");
                    break;
                case 4:
                    System.out.println("五等奖,10元!");
                    break;
                default:
                    System.out.println("很遗憾,您没有中奖!");
                    break;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值