Java模拟好物夺宝规则示例

首先看下好物的夺宝规则

在这里插入图片描述

然后直接上代码
部分数据可能不一样,比如它用的体彩,但是因为我也搞不清这些彩票的区别就用6+1的福彩替代

package com.sakura.common.tool;
import java.util.*;
import java.text.DecimalFormat;

/**
 * @author Sakura
 * @date 2023/9/18 17:24
 */
public class LotterySimulator {

    public static void main(String[] args) {
        /**
         * 中奖号码计算规则
         * (数值A*数值B/参加人数)取余+10000001
         * 数值A 最后一个参加活动人的时间 这里取的是时分秒毫秒 如12:30:30:300就是123030300
         * 数值B 当天福利彩票开奖号码 如开奖球10, 14, 17, 20, 9, 13, 10就是10141720913
         */
        // 计算每个号码出现次数
        List<Long> numbers = new ArrayList<>();
        for (int i = 0; i < 500000; i++) {
            // 获取一个随机日期时分秒
            // 这里有个问题,因为参加活动一般有个截止日期,比如晚上21:00:00结束,所以其实最后一个日期应该会无限接近这个值
            Long timeNum = getTime();
            System.out.println("随机日期:" + timeNum);
            // 模拟福彩当天抽奖号码
            Long welfareNum = welfareLottery();
            System.out.println("中奖号码:" + welfareNum);
            // 获取一个随机数当做参加活动的人数
            Long personNum = getPersonNum();
            System.out.println("活动人数:" + personNum);
            // 开始计算中奖号码
            Long winningNum = timeNum*welfareNum%personNum + 10000001;
            System.out.println("最终中奖号码:" + winningNum);

            numbers.add(winningNum);
        }

        // 使用Map来统计数字出现次数
        Map<Long, Integer> numberCount = new HashMap<>();
        for (Long number : numbers) {
            numberCount.put(number, numberCount.getOrDefault(number, 0) + 1);
        }

        // 将Map中的条目按照出现次数从大到小排序
        List<Map.Entry<Long, Integer>> sortedEntries = new ArrayList<>(numberCount.entrySet());
        sortedEntries.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue()));

        // 打印排序后的结果
        for (Map.Entry<Long, Integer> entry : sortedEntries) {
            // 这里只看出现次数大于2的
            if (entry.getValue() > 10) {
                System.out.println("数字 " + entry.getKey() + " 出现次数: " + entry.getValue());
            }
        }

    }

    public static Long welfareLottery() {
        // 定义双色球号码范围
        List<Integer> redBalls = new ArrayList<>();
        List<Integer> blueBalls = new ArrayList<>();
        // 生成红色球
        for (int i = 1; i <= 33; i++) {
            redBalls.add(i);
        }
        // 生成蓝色球
        for (int i = 1; i <= 16; i++) {
            blueBalls.add(i);
        }

        // 模拟中奖号码
        List<Integer> winningRedBalls = new ArrayList<>();
        List<Integer> winningBlueBalls = new ArrayList<>();
        // 将红球打乱
        Collections.shuffle(redBalls);
        // 随机取六个球
        for (int i = 0; i < 6; i++) {
            winningRedBalls.add(redBalls.get(i));
        }
        // 将蓝球打乱
        Collections.shuffle(blueBalls);
        // 随机取一个篮球
        winningBlueBalls.add(blueBalls.get(0));

        List<Integer> winningBalls = new ArrayList<>(winningRedBalls);
        winningBalls.addAll(winningBlueBalls);

        System.out.println("中奖号码:" + winningBalls);

        // 将List中的数字按顺序拼接成一个数
        StringBuilder concatenatedNumber = new StringBuilder();
        for (Integer number : winningBalls) {
            concatenatedNumber.append(number);
        }

        // 将拼接的字符串转换为整数
        Long result = Long.parseLong(concatenatedNumber.toString());

        return result;
    }

    public static Long getTime() {
        // 生成一个随机日期时分秒
        Random random = new Random();

        // 生成随机的时、分、秒、毫秒数值
        int hour = random.nextInt(24);     // 0到23之间的随机小时
        int minute = random.nextInt(60);   // 0到59之间的随机分钟
        int second = random.nextInt(60);   // 0到59之间的随机秒
        int millis = random.nextInt(1000); // 0到999之间的随机毫秒

        // 创建一个Calendar对象并设置时间字段
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        calendar.set(Calendar.MILLISECOND, millis);

        // 使用DecimalFormat格式化时间
        DecimalFormat decimalFormat = new DecimalFormat("000000000");
        String formattedTime = decimalFormat.format(
                calendar.get(Calendar.HOUR_OF_DAY) * 10000000 +
                        calendar.get(Calendar.MINUTE) * 100000 +
                        calendar.get(Calendar.SECOND) * 1000 +
                        calendar.get(Calendar.MILLISECOND));

        // 打印生成的随机时间
        System.out.println("随机生成的格式化时间: " + formattedTime);

        return Long.valueOf(formattedTime);
    }

    public static Long getPersonNum() {
        // 生成一个随机日期时分秒
        Random random = new Random();

        // 生成1到100000之间的随机数
        int randomNumber = random.nextInt(100000) + 1;

        return Long.valueOf(randomNumber);
    }

}


上面这个程序在执行多次后我们可以发现出现次数最多的永远是10000001
而这个数就是它们一开始规则里面的底数

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值