java算法实现预测双色球中奖号码
双色球选号规则红球是1~33选6个,蓝球1~16选1个。
它有17721088种排列组合,
这个代码实现了如何将一组双色球号码转换成第n个排列组合数字,
以及如何根据第n个排列组合数字生成一组双色球号码。
分析一下今年的中奖号码所隐含的排列组合序号,也许你会找到规律,
哈哈,或许你能用它算出下一次的中奖号码,赶快试试吧!
DoubleColorBall.java
importjava.util.Arrays;
publicclassDoubleColorBall{
/**
*根据双色球生成绝对序号(原理:排列组合算法)
*abcdef是红球由小到大g是蓝球
*/
publicstaticfinalintgetBallIndex(inta,intb,intc,intd,inte,intf,intg){
return(comp(33,6)-comp(34-a,6)+comp(33-a,5)-comp(34-b,5)
+comp(33-b,4)-comp(34-c,4)+comp(33-c,3)-comp(34-d,3)
+comp(33-d,2)-comp(34-e,2)+comp(33-e,1)-comp(33-f,1))*16+g;
}
/**
*根据绝对序号生成双色球(原理:遍历所有组合)
*abcdef是红球由小到大
*/
publicstaticfinalStringgetBall(longballIndex){
if(ballIndex>17721088)ballIndex=ballIndex%17721088;
intredIndex=(int)(ballIndex/16);
intcount=0;
for(inta=1;a<29;a++)
for(intb=a+1;b<30;b++)
for(intc=b+1;c<31;c++)
for(intd=c+1;d<32;d++)
for(inte=d+1;e<33;e++)
for(intf=e+1;f<34;f++){//最多循环1107568次,即为红球组合数
count++;
if(redIndex==count){
returnArrays.toString(newint[]{a,b,c,d,e,f,1+((int)ballIndex-1)%16});
}
}
returnnull;
}
/**
*计算组合数C(m,n)
*/
publicstaticfinalintcomp(intm,intn)
{
intsum=1;
for(inti=m;i>m-n;i--)sum=sum*i;
for(inti=n;i>1;i--)sum=sum/i;
returnsum;
}
publicstaticvoidmain(String[]args){
//11月29日开奖结果对应序号:
System.out.println(getBallIndex(6,20,28,29,30,31,12));//12964124
System.out.println(getBall(12964124));//[6,20,28,29,30,31,12]
//12月1日开奖结果对应序号:
System.out.println(getBallIndex(3,8,19,25,27,28,2));//7353378
System.out.println(getBall(7353378));//[3,8,19,25,27,28,2]
//12月3日开奖结果对应序号:
System.out.println(getBallIndex(13,17,19,20,22,25,11));//17009451
System.out.println(getBall(17009451));//[13,17,19,20,22,25,11]
System.out.println("预测下次开奖号码,赶快去买吧!");
System.out.println(getBall(System.nanoTime()));
}
}
另外附上java双色球复式号码,排列组合出所有单注号码
publicclassTest{
/**
*双色球复式组合
*@paramredBall 红球数组
*@paramblueBall 篮球数组
*@return 产生的组合个数
*/
publicstaticintgetDoubleChromosphere(Integer[]redBall,int[]blueBall){
intcount=0;//产生的组合个数
List<Integer>result=newLinkedList<Integer>();;//产生的双色球组合
//外层循环控制篮球
for(inti=0;i<blueBall.length;i++){
//控制红球
List<Integer>redList=newLinkedList<Integer>();
for(Integerj:redBall){
redList.add(j);
}
List<Integer>orign=newLinkedList<Integer>();
orign.addAll(redList);
for(intk=0;k<redList.size();k++){
redList.remove(k);
result=redList;
//最后篮球的赋值
result.add(blueBall[i]);
//输出组合结果
System.out.print("红球为:\t");
for(intj=0;j<result.size();j++){
if(6==j){
System.out.println("篮球为:\t"+result.get(j));
break;
}
System.out.print(result.get(j)+"\t");
}
System.out.println();
//清空redLisr,重新赋值
redList.clear();
redList.addAll(orign);
//组合数加一
count++;
}
}
returncount;
}
}