CP机选算法

java 复制代码
package com.cp;


import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.*;

/**
 * desc
 */
public class CpRandomUtil {
    private static final Logger logger = LoggerFactory.getLogger(CpRandomUtil.class);
    public static void main(String[] args) throws IOException {
        printSsq();
//        tjRate();
    }

    private static void printSsq() throws IOException {
        String ssq = IOUtils.toString(new FileInputStream("D:\\我的\\ssq.txt"), Charset.forName("UTF-8"));
        String[] strs = ssq.split("\n");
        List<List<String>> allSsq = new ArrayList<>();
        for (String str : strs) {
            String[] split = str.split(",");
            List<String> ss = new ArrayList<>();
            for (String s : split) {
                ss.add(s.trim());
            }
            allSsq.add(ss);
        }
        List<List<String>> oldssq = new ArrayList<>();
        List<Integer> indexList = tjRange();
        System.out.println(indexList);
        for (Integer index : indexList) {
            String str = strs[index - 1];
            String[] split = str.split(",");
            List<String> ss = new ArrayList<>();
            for (String s : split) {
                ss.add(s.trim());
            }
            oldssq.add(ss);
        }

        int[] d = {2, 2, 3};
        int di = 0;
        for (int i = 0; i < 3; i++) {
            printSsq(oldssq, d[di], allSsq);
            di++;
            if (di == 3) {
                di = 0;
            }
            System.out.println("");
        }
    }

    private static void tjRate() throws IOException {
        String ssq = IOUtils.toString(new FileInputStream("D:\\我的\\ssq.txt"), Charset.forName("UTF-8"));
        String[] strs = ssq.split("\n");
        List<List<String>> oldssq = new ArrayList<>();
        for (String str : strs) {
            String[] split = str.split(",");
            List<String> ss = new ArrayList<>();
            int cnt = 1;
            for (String s : split) {
                if (cnt == 7) {
                    break;
                }
                ss.add(s.trim());
                cnt++;
            }
            oldssq.add(ss);
        }
        // 不重复号码数的统计值,key是不重复号码数量,value是统计次数
        Map<Integer, Integer> m = new HashMap<>();
        // 不重复号码距离值的统计数,key是距离,value是统计次数
        Map<Integer, Integer> m2 = new TreeMap<>();
        for (int i = 0; i < oldssq.size(); i++) {
            List<String> old = oldssq.get(i);
            int size = old.size();
            // 最少不重复号码数的号码距离
            int jl = 1;
            for (int i2 = i + 1; i2 < oldssq.size(); i2++) {
                List<String> old2 = oldssq.get(i2);
                List<String> old3 = new ArrayList<>(old);
                old3.removeAll(old2);
                if (size > old3.size()) {
                    size = old3.size();
                    jl = i2 - i;
                }
            }

            if (m.containsKey(size)) {
                m.put(size, m.get(size) + 1);
            } else {
                m.put(size, 1);
            }
            if (m2.containsKey(jl)) {
                m2.put(jl, m2.get(jl) + 1);
            } else {
                m2.put(jl, 1);
            }
        }
        System.out.println(m);
        Map<Integer, List> m3 = new TreeMap<>();
        for (Map.Entry<Integer, Integer> entry : m2.entrySet()) {
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            if (m3.containsKey(value)) {
                m3.get(value).add(key);
            } else {
                ArrayList list = new ArrayList();
                list.add(key);
                m3.put(value, list);
            }
        }
        System.out.println(m2);
    }

    private static List<Integer> tjRange() throws IOException {
        String ssq = IOUtils.toString(new FileInputStream("D:\\我的\\ssq.txt"), Charset.forName("UTF-8"));
        String[] strs = ssq.split("\n");
        List<List<String>> oldssq = new ArrayList<>();
        for (String str : strs) {
            String[] split = str.split(",");
            List<String> ss = new ArrayList<>();
            for (String s : split) {
                ss.add(s.trim());
            }
            oldssq.add(ss);
        }
        // 不重复号码距离值的统计数,key是距离,value是统计次数
        // 只统计不重复号码数为2和3的距离值
        Map<Integer, Integer> m = new HashMap<>();
        for (int i = 0; i < oldssq.size(); i++) {
            List<String> old = oldssq.get(i);
            int size = old.size();
            int range = 1;
            for (int i2 = i + 1; i2 < oldssq.size(); i2++) {
                List<String> old2 = oldssq.get(i2);
                List<String> old3 = new ArrayList<>(old);
                old3.removeAll(old2);
                if (size > old3.size()) {
                    size = old3.size();
                    range = i2 - i;
                }
            }
            if (i == 0) {
                System.out.println("第一个" + old + ",size:" + size + ", range:" + range);
            }
            if (size == 2 || size == 3) {
                if (m.containsKey(range)) {
                    m.put(range, m.get(range) + 1);
                } else {
                    m.put(range, 1);
                }
            }

        }
        Map<Integer, List> m3 = new TreeMap<>();
        for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            if (m3.containsKey(value)) {
                m3.get(value).add(key);
            } else {
                ArrayList list = new ArrayList();
                list.add(key);
                m3.put(value, list);
            }
        }
//        System.out.println(m3);

        // 获取统计次数大于等5的距离值(也是双色球列表里的索引,用的时候要减1)
        List<Integer> indexList = new ArrayList<>();
        for (Map.Entry<Integer, List> entry : m3.entrySet()) {
            Integer range = entry.getKey();
            if (range >= 5) {
                indexList.addAll(entry.getValue());
            }
        }
        return indexList;
    }

    private static void tjNoRepeat() throws IOException {
        String ssq = IOUtils.toString(new FileInputStream("D:\\我的\\ssq.txt"), Charset.forName("UTF-8"));
        String[] strs = ssq.split("\n");
        List<List<String>> oldssq = new ArrayList<>();
        for (String str : strs) {
            String[] split = str.split(",");
            List<String> ss = new ArrayList<>();
            for (String s : split) {
                ss.add(s.trim());
            }
            oldssq.add(ss);
        }
        // 不重复号码数的统计值,key是不重复号码数量,value是统计次数
        Map<Integer, Integer> m = new HashMap<>();
        for (int i = 0; i < oldssq.size(); i++) {
            List<String> old = oldssq.get(i);
            int size = old.size();
            for (int i2 = i + 1; i2 < oldssq.size(); i2++) {
                List<String> old2 = oldssq.get(i2);
                List<String> old3 = new ArrayList<>(old);
                old3.removeAll(old2);
                if (size > old3.size()) {
                    size = old3.size();
                }
            }

            if (m.containsKey(size)) {
                m.put(size, m.get(size) + 1);
            } else {
                m.put(size, 1);
            }
        }
        System.out.println(m);
    }

    private static void printSsq(List<List<String>> oldssq, int size, List<List<String>> allSsq) {
        List<String> reds = new ArrayList<>();
        for (int i = 1; i <= 33; i++) {
            reds.add(i > 9 ? "" + i : "0" + i);
        }
        // 0-1的随机数
        Set redsOut = new TreeSet();
        for (int i = 0; i < 6; i++) {
            double random = Math.random();
            int index = (int) (reds.size() * random);
            String red = reds.get(index);
            reds.remove(index);
            redsOut.add(red);
        }
        List<String> blues = new ArrayList<>();
        for (int i = 1; i <= 16; i++) {
            blues.add(i > 9 ? "" + i : "0" + i);
        }
        double random = Math.random();
        int index = (int) (blues.size() * random);
        String blue = blues.get(index);

        boolean retry = true;
        for (List<String> old : oldssq) {
            List<String> out2 = new ArrayList<>();
            out2.addAll(redsOut);
            out2.add(blue);
            out2.removeAll(old);
            if (out2.size() == size) {
                retry = checkAll(allSsq, redsOut, blue, size);
            }
            if (out2.size() < size) {
                retry = true;
                break;
            }
        }
        if (retry) {
            printSsq(oldssq, size, allSsq);
            return;
        }

        System.out.print(redsOut.toString().replace("[", "").replace("]", ", "));
        System.out.print(blue);
    }

    /**
     * 检查机选出来的号码和所有号码对比是否存在size更小的号码
     * @param allSsq
     * @param redsOut
     * @param blue
     * @param size
     * @return boolean
     */
    private static boolean checkAll(List<List<String>> allSsq, Set redsOut, String blue, int size) {
        for (List<String> old : allSsq) {
            List<String> out2 = new ArrayList<>();
            out2.addAll(redsOut);
            out2.add(blue);
            out2.removeAll(old);
            if (out2.size() < size) {
                return true;
            }
        }
        return false;
    }
}
相关推荐
rainbow68893 分钟前
Java并发三要素:原子性、可见性、有序性
java
小罗和阿泽6 分钟前
复习 Java(2)
java·开发语言
不懒不懒18 分钟前
【HTML容器与表格布局实战指南】
java·开发语言
J_liaty19 分钟前
Java实现PDF添加水印的完整方案(支持灵活配置、平铺、多页策略)
java·开发语言·pdf
一路向北⁢21 分钟前
Spring Boot 3 整合 SSE (Server-Sent Events) 企业级最佳实践(二)
java·数据库·spring boot·sse·通信
chilavert31821 分钟前
技术演进中的开发沉思-349:高效并发(下)
java·jvm
shejizuopin1 小时前
基于SSM的高校旧书交易系统的设计与实现(任务书)
java·mysql·毕业设计·论文·任务书·基于ssm的·高校旧书交易系统的设计与实现
1candobetter1 小时前
JAVA后端开发——Spring Boot 组件化自动配置机制
java·开发语言·spring boot
码农小卡拉1 小时前
MyBatis-Flex 全面解析与实战教程:轻量高效的 MyBatis 增强方案
java·mybatis
没有bug.的程序员1 小时前
Spring Boot 与 Sleuth:分布式链路追踪的集成、原理与线上故障排查实战
java·spring boot·分布式·后端·分布式链路追踪·sleuth·线上故障排查