双色球选号规则红球是1~33选6个,蓝球1~16选1个。
它有17721088种排列组合,
这个代码实现了如何将一组双色球号码 转换成第n个排列组合数字,
以及如何根据第n个排列组合数字生成一组双色球号码。
分析一下今年的中奖号码所隐含的排列组合序号,也许你会找到规律,
哈哈,或许你能用它算出下一次的中奖号码,赶快试试吧!
DoubleColorBall.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
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双色球复式号码,排列组合出所有单注号码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
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;
}
}
|