首先看下好物的夺宝规则
然后直接上代码
部分数据可能不一样,比如它用的体彩,但是因为我也搞不清这些彩票的区别就用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
而这个数就是它们一开始规则里面的底数