雙色球選號規則紅球是1~33選6個,藍球1~16選1個。
它有17721088種排列組合,
這個代碼實現了如何將一組雙色球號碼 轉換成第n個排列組合數字,
以及如何根據第n個排列組合數字產生一組雙色球號碼。
分析一下今年的中獎號碼所隱含的排列組合序號,也許你會找到規律,
哈哈,或許你能用它算出下一次的中獎號碼,趕快試試吧!
DoubleColorBall.java
import java.util.Arrays; public class DoubleColorBall { /** * 根據雙色球產生絕對序號(原理:排列組合演算法) * a b c d e f 是紅球由小到大 g是藍球 */ public static final int getBallIndex(int a,int b,int c,int d,int e,int f,int g){ 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; } /** * 根據絕對序號產生雙色球(原理:遍曆所有組合) * a b c d e f 是紅球由小到大 */ public static final String getBall(long ballIndex){ if(ballIndex>17721088)ballIndex=ballIndex%17721088; int redIndex=(int) (ballIndex/16); int count=0; for(int a=1;a<29;a++) for(int b=a+1;b<30;b++) for(int c=b+1;c<31;c++) for(int d=c+1;d<32;d++) for(int e=d+1;e<33;e++) for(int f=e+1;f<34;f++){//最多迴圈1107568次,即為紅球組合數 count++; if(redIndex==count){ return Arrays.toString(new int[]{a,b,c,d,e,f,1+((int)ballIndex-1)%16}); } } return null; } /** * 計算群組合數C(m,n) */ public static final int comp(int m, int n) { int sum=1; for(int i=m;i>m-n;i--)sum=sum*i; for(int i=n;i>1;i--)sum=sum/i; return sum; } public static void main(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雙色球複式號碼,排列組合出所有單注號碼
public class Test {/*** 雙色球複式組合* @param redBall紅球數組* @param blueBall籃球數組* @return產生的組合個數*/public static int getDoubleChromosphere(Integer [] redBall,int [] blueBall){int count = 0;//產生的組合個數List<Integer> result = new LinkedList<Integer>();;//產生的雙色球組合//外層迴圈控制籃球for(int i = 0;i < blueBall.length;i++){//控制紅球List<Integer> redList = new LinkedList<Integer>();for(Integer j : redBall){redList.add(j);}List<Integer> orign = new LinkedList<Integer>();orign.addAll(redList);for(int k = 0;k < redList.size();k++){redList.remove(k);result = redList;//最後籃球的賦值result.add(blueBall[i]);//輸出組合結果System.out.print("紅球為:\t");for(int j = 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++;}}return count;}}