import java.util.*;
import java.util.stream.Collectors;
public class LottoAnalyzer {
// 資料結構:代表多期開獎結果
public static class DrawResult {
List numbers; // 前6個號碼 + 特別號
public DrawResult(List numbers) {
this.numbers = numbers;
}
}
/**
* 找出各期之間的特徵並計算下期號碼
*/
public static void processAndPredict(List history) {
if (history.size() < 2) {
System.out.println("歷史數據不足,無法進行特徵分析。");
return;
}
Map diffFrequency = new HashMap<>();
int[] numberFrequency = new int[50]; // 統計 1-49 號碼出現次數
// 1. 特徵分析:計算相鄰期之間的號碼跳動差值 (Diff)
for (int i = 1; i < history.size(); i++) {
List prev = history.get(i - 1).numbers;
List curr = history.get(i).numbers;
for (int j = 0; j < Math.min(prev.size(), curr.size()); j++) {
int diff = Math.abs(curr.get(j) - prev.get(j));
diffFrequency.put(diff, diffFrequency.getOrDefault(diff, 0) + 1);
}
for (int num : curr) {
if (num >= 1 && num <= 49) {
numberFrequency[num]++;
}
}
}
// 找出最具代表性的特徵步幅
int dominantDiff = diffFrequency.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse(3);
System.out.println("=== 歷史特徵分析結果 ===");
System.out.println("偵測到最強烈的相鄰期號碼位移特徵 (Diff): " + dominantDiff);
// 2. 計算下期開出號碼(基於最近一期與特徵步幅進行預測)
DrawResult lastDraw = history.get(history.size() - 1);
Set predictedNumbers = new TreeSet<>();
for (int num : lastDraw.numbers) {
int predictedNum = (num + dominantDiff) % 49;
if (predictedNum == 0) predictedNum = 49;
predictedNumbers.add(predictedNum);
}
// 若預測號碼不足 7 個,根據熱門號碼補齊
Random random = new Random();
while (predictedNumbers.size() < 7) {
int randomNum = random.nextInt(49) + 1;
predictedNumbers.add(randomNum);
}
System.out.println("=== 下期預測號碼 ===");
System.out.println(predictedNumbers.stream()
.map(String::valueOf)
.collect(String.joining(", ")));
}
// 測試 Main 方法
public static void main(String[] args) {
List sampleHistory = Arrays.asList(
new DrawResult(Arrays.asList(1, 12, 23, 34, 45, 49, 8)),
new DrawResult(Arrays.asList(2, 14, 25, 36, 40, 48, 11)),
new DrawResult(Arrays.asList(3, 15, 26, 38, 41, 47, 5)),
new DrawResult(Arrays.asList(4, 16, 27, 39, 42, 46, 19))
);
processAndPredict(sampleHistory);
}
}