纯java原生态模拟双色球、大乐透规则进行出球,原理:比如双色球,红球33.蓝球16个,先进行红球出球计算,按照双色球出球的规则随机将33个球放入数组或集合中,规定一个出球的方向,随机数12个绑定33个数,比如规定6点钟方向出球,则随机数与绑定的随机数相等时则将随机数绑定的33个数中的那个数出去,完成出球,即2次随机数相等则出球。其中也加入了开始摇球是速度是很快的,但运行一段时间后减慢速度以便出球,这和双色球真实开奖出球差不多。
本人亲测,随便猜一组号码,猜中概率最好也得好几万次,最坏的情况就得几百万次。
有兴趣的小伙伴也可以直接弄个Android开发包,做个app,可以在手机上面玩。
郑重声明:此算法只供娱乐,不做实际参考。
import java.util.*;
/**
* 彩票算法
* Created by jesonking
* 双色球 6点钟方向出球
* 大乐透 12点方向
* 功能1:普通生成号码预测,并给出高频号码
* 1、参数:彩票类型,输出次数,高频红球输出个数,高频蓝球输出个数
* 功能2:根据当期开奖号码,预测下次号码。若最高100万次还未匹配到中奖号码则自动给出一组号码
* 2、参数:当期开奖号码,匹配次数:10000,100000,1000000
*/
public class CaipiaoCal {
public static void main(String[] args) {
printfCP(1,2000);
//printfCP(2,200);
//根据当前号码预测下一次号码
/* String currentCaipiao = "04,05,06,13,18,21";
//String currentCaipiao = "07,08,13,19,29,11,12";
String[] strs=currentCaipiao.split(",");
List list= Arrays.asList(strs);*/
/* String logcaipiao = getOneCPByLot(2,100);
System.out.println(logcaipiao);
logcaipiao = getOneCPByLot(1,100);*/
//System.out.println("双色球:"+nextCaipiao(logcaipiao,2,1000000) + ",高频彩票:" + logcaipiao);
//System.out.println("大乐透:"+nextCaipiao(currentCaipiao,2,100));
//nextCaipiao(logcaipiao.substring(1,logcaipiao.length()-1),1,1000000,6);
/*String currentCaipiao = "06,08,09,13,19,22,10";
nextCaipiao(currentCaipiao,1,500000,6);*/
//System.out.println(logcaipiao);
//getOftenAppearCaipiao(1,20,100000,6);
}
/**
* 通过高频数字组合获取一组号码,规则是
* 3,2,1. 前5个高频中选3个,前6到10中选2个,11-15以后的选一个
* 大乐透是3,1,1
* 蓝球:从前5个中选一个或者2个
* @param type 1:双色球 2:大乐透
* @param execTime 执行多少次,进行计算输出
* @return
*/
private static String getOneCPByLot(int type,int execTime){
List resultList = new ArrayList<>();
int redNum = 33;
int blueNum = 16;
if(type == 2){
redNum = 35;
blueNum = 12;
}
Map lotMap = printfCP(type,execTime,redNum,blueNum);
List redList = new ArrayList<>();
String redStr = lotMap.get("redLotStr");
redStr = redStr.substring(1,redStr.length() -1);
String blueStr = lotMap.get("blueLotStr");
blueStr = blueStr.substring(1,blueStr.length() -1);
String[] redArr = redStr.split(",");
//获取前三个
List list12 = getRandomNumList(3,0,5);
redList.add(redArr[list12.get(0)].trim());
redList.add(redArr[list12.get(1)].trim());
redList.add(redArr[list12.get(2)].trim());
//获取前2个或1个
List list24 = null;
if(type == 1){
list24 = getRandomNumList(2,5,10);
redList.add(redArr[list24.get(0)].trim());
redList.add(redArr[list24.get(1)].trim());
}else{
list24 = getRandomNumList(1,5,10);
redList.add(redArr[list24.get(0)].trim());
}
//最后一个
List list24Over = getRandomNumList(1,10,15);
redList.add(redArr[list24Over.get(0)].trim());
Collections.sort(redList);
resultList.addAll(redList);
//获取蓝球
List blueList = new ArrayList<>();
String[] blueArr = blueStr.split(",");
List list12Or16 = null;
if(type == 1){
list12Or16 = getRandomNumList(1,0,5);
blueList.add(blueArr[list12Or16.get(0)].trim());
}else{
list12Or16 = getRandomNumList(2,0,5);
blueList.add(blueArr[list12Or16.get(0)].trim());
blueList.add(blueArr[list12Or16.get(1)].trim());
}
Collections.sort(blueList);
resultList.addAll(blueList);
return resultList.toString();
}
/**
* 默认
* 随机打印多少组彩票
* @param type 1:双色球 2:大乐透
* @param num 打印次数
*/
private static Map printfCP(int type,int num){
return printfCP(type,num,10,5);
}
/**
* 随机打印多少组彩票
* @param type 1:双色球 2:大乐透
* @param num 打印次数
* @param redNum 红球高频输出次数 redLotStr
* @param blueNum 蓝球高频输出次数 blueLotStr
*/
private static Map printfCP(int type,int num,int redNum,int blueNum){
List lotRedList = new ArrayList<>();//存放红球
List lotLanList = new ArrayList<>();//存放蓝球
List ssqList = null;
List dltList = null;
for(int i = 0;i redNumList = handlerLotNum(lotRedList,redNum);
List blueNumList = handlerLotNum(lotLanList,blueNum);
System.out.println("出现的高频红球数字:" + redNumList.toString());
System.out.println("出现的高频蓝球数字:" + blueNumList.toString());
Map resultMap = new HashMap<>();
resultMap.put("redLotStr",redNumList.toString());
resultMap.put("blueLotStr",blueNumList.toString());
return resultMap;
}
/**
* 自动红球和篮球分到对应的集合中
* @param qiuList
* @param type
* @return
*/
private static void autoFenPei(List qiuList,List redList,List blueList,int type){
redList.add(qiuList.get(0));
redList.add(qiuList.get(1));
redList.add(qiuList.get(2));
redList.add(qiuList.get(3));
redList.add(qiuList.get(4));
if(type == 1){
redList.add(qiuList.get(5));
}else{
blueList.add(qiuList.get(5));
}
blueList.add(qiuList.get(6));
}
public static String nextCaipiao(String currentCaipiao,int type){
int execTime = 1000000;
return nextCaipiao(currentCaipiao,type,execTime);
}
/**
* 获取随机中最快出现的一组数据
* @param type 彩票类型
* @param forNum 循环次数
* @param execTime 检测循环次数
* @param num 匹配几个号码
* @return 返回最快出现的一组号码
*/
public static String getOftenAppearCaipiao(int type,int forNum,int execTime,int num){
String result = "";
String oneHaoMa = "";
int min = execTime;//开始计算的时候,就设置循环执行的次数
for(int k=0;k oldlist= Arrays.asList(strs);
List ssqList = null;
List dltList = null;
while (true){
count++;
int tempNum = 0;//用于计数,对应几个球
if(type == 1){
ssqList = shuangSeQiu();
int ssqLen = ssqList.size();
int oldLen = oldlist.size();
for(int i=0;i= num){
System.out.println("匹配的一组双色球是:"+ssqList.toString());
break;
}
}else{
dltList = daLeTou();
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(dltList.get(i).trim().equals(oldlist.get(j).trim())){
tempNum += 1;
}
}
}
if(num >= 6 && tempNum == 5){
for(int i=5;i<7;i++){
for(int j=5;j<7;j++){
if(dltList.get(i).trim().equals(oldlist.get(j).trim())){
tempNum += 1;
}
}
}
}
if(tempNum >= num){
System.out.println("匹配的一组大乐透是:"+dltList.toString());
break;
}
}
//System.out.println("次数:" + count);
if(count > execTime){//1百万次还没有找到就随机返回一组彩票号码
break;
}
}
//handlerLotNum(dataList);
/*if(type == 1){
return shuangSeQiu().toString();
}else{
return daLeTou().toString();
}*/
return count;
}
/**
* 给出当前的彩票号码,预测计算出下一次号码
* @param currentCaipiao
* @param type 1:双色球 2:大乐透
* @param execTime 如果一直未找到,则执行多少次后,返回一组号码 默认1百万
* @return
*/
public static String nextCaipiao(String currentCaipiao,int type,int execTime){
String ssq = null;
String dlt = null;
int count = 0;//进行多少次运算
List dataList = new ArrayList<>();//用于存放每次的出球
List ssqList = null;
List dltList = null;
while (true){
count++;
if(type == 1){
ssqList = shuangSeQiu();
dataList.addAll(ssqList);
ssq = ssqList.toString();
if(currentCaipiao.equals(ssq)){
break;
}
}else{
dltList = daLeTou();
dataList.addAll(dltList);
dlt = dltList.toString();
if(currentCaipiao.equals(dlt)){
break;
}
}
System.out.println("次数:" + count);
if(count > execTime){//1百万次还没有找到就随机返回一组彩票号码
break;
}
}
//handlerLotNum(dataList);
if(type == 1){
return shuangSeQiu().toString();
}else{
return daLeTou().toString();
}
}
/**
* 双色球
* @return
*/
public static List shuangSeQiu(){
int direct = 6;//6点钟方向
//红球
int redNum = 6;//红色个数
int redLen = 33;
int blueNum = 1;//蓝色个数
int blueLen = 16;
return caiPiaoList(direct,redNum,redLen,blueNum,blueLen);
}
/**
* 大乐透
* @return
*/
public static List daLeTou(){
int direct = 12;
int redNum = 5;//红色个数
int redLen = 35;
int blueNum = 2;//蓝色个数
int blueLen = 12;
return caiPiaoList(direct,redNum,redLen,blueNum,blueLen);
}
/**
* 一组彩票数据 大乐透或双色球
* @param direct 几点钟方向出球
* @param redNum 红色数量 出球
* @param redLen 红色球总数量
* @param blueNum 蓝色数量 出球
* @param blueLen 蓝色球总数量
* @return
*/
public static List caiPiaoList(int direct,int redNum,int redLen,int blueNum,int blueLen){
List redList = cal(redLen,direct,redNum);
Collections.sort(redList);
List blueList = cal(blueLen,direct,blueNum);
Collections.sort(blueList);
redList.addAll(blueList);
return redList;
}
/**
* 出球红球或篮球数组
* @param len 长度
* @param direct 方向
* @param num 出几个球
* @return
*/
private static List cal(int len,int direct,int num){
List oldBall = new ArrayList<>();//已出球
for(int i = 1; i <= num; i++){
oldBall.add(outBall(len,direct,200,oldBall));
}
return oldBall;
}
/**
*
* 出球
* @param len 篮球或红球的数组长度
* @param direct 几点钟方向出球 双色球 6点,大乐透12点
* @param time 降慢执行速度,以便出球
* @param oldBall 已出的球,要从集合中去掉
* @return
*/
private static String outBall(int len,int direct,int time,List oldBall){
//循环无数次,直到某个数字和几点钟方向一致,则出球
String[] redArr = getAutoArr(len);
int oldLen = oldBall.size();
List newList = new ArrayList<>();
for(int i = 0;i < len; i++){
boolean flag = true;//该球还未出
for(int j = 0;j < oldLen;j++){
if(redArr[i].equals(oldBall.get(j))){
flag = false;
break;
}
}
if(flag){
newList.add(redArr[i]);
}
}
int count = 0;//当5s之后还没有出球,则降低执行速度 即count = 5000
int newLen = newList.size();
List tempList = null;
while(true){
tempList = getRandomNumList(newLen,1,len+1);
boolean flag = false;
int xb = 0;//记录出球的下标
int tempLen = tempList.size();
for(int i = 0;i < tempLen;i++){
if(direct == tempList.get(i)){
xb = i;
flag = true;
break;
}
}
if(flag){
return newList.get(xb);
}
if(count>5000){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
count++;
}
}
}
//定义生成随机数并且装入集合容器的方法
//方法的形参列表分别为:生成随机数的个数、生成随机数的值的范围最小值为start(包含start)、值得范围最大值为end(不包含end) 可取值范围可表示为[start,end)
private static List getRandomNumList(int nums,int start,int end){
//1.创建集合容器对象
List list = new ArrayList();
//2.创建Random对象
Random r = new Random();
//循环将得到的随机数进行判断,如果随机数不存在于集合中,则将随机数放入集合中,如果存在,则将随机数丢弃不做操作,进行下一次循环,直到集合长度等于nums
while(list.size() != nums){
int num = r.nextInt(end-start) + start;
if(!list.contains(num)){
list.add(num);
}
}
return list;
}
/**
* 生成字符串数组
* @param len
* @return
*/
private static String[] getAutoArr(int len){
String[] strArr = new String[len];
for(int i = 0;i < len; i++){
if(i < 9){
strArr[i] = "0" + (i+1);
}else {
strArr[i] = "" + (i+1);
}
}
return strArr;
}
/**
* 高频数
* @param allData
* @param outNum 输出多少位高频数字
* @return
*/
private static List handlerLotNum(List allData,int outNum){
Map mathMap = new LinkedHashMap<>();
for(String temp:allData){
Integer count = mathMap.get(temp);
mathMap.put(temp, (count == null) ? 1 : count + 1);
}
ArrayList> entries= sortMap(mathMap);
int size = entries.size();
int n = 0;
List lotNum = new ArrayList<>();//执行次数中出现最多的一组数据
for( int i=0;i> sortMap(Map map){
List> entries = new ArrayList>(map.entrySet());
Collections.sort(entries, new Comparator>() {
public int compare(Map.Entry obj1 , Map.Entry obj2) {
return obj2.getValue() - obj1.getValue();
}
});
return (ArrayList>) entries;
}
}