计算双色球的中奖概率
1 /** 2 * ClassName: LotteryQuestion 3 * @Description: TODO 4 * @category 听到有人忽悠说双色球二等奖比三等奖好中,还说打电话去福彩中心,人说"Yes!" 5 * 很愤慨 这国家到处都是忽悠只缘于你们高中数学真的不及格 6 * 7 * 例如 我们国家福彩中心规则玩法 : 33个红球里选6,16个蓝球里选1 8 * 忽悠: " 2等奖几率大于3等奖 " 9 * 10 * 事实上这里有一个陷阱 11 * 12 * 二等奖的算法 应该是涵盖15个未摇中的篮球 因为不这样做就可能涵盖一等奖了 13 * [c15(1)*(1/[start2generateBalls])] 14 * 三等奖的算法应该是 6球选5球 再剩下的27球里选一个球 这样就不会涵盖二等奖 15 * c6(5)*c27(1)*(1/[start2generateBalls]) 16 * @author Owen 17 * @date 2015年12月22日 18 */ 19 public class LotteryQuestion { 20 private static int start2generateBalls() { 21 return C(33, 6) * C(16, 1);// 双色球33选6 16选1 22 } 23 static int C(int k, int n) { 24 int rs = 1; 25 for (int i = 1; i <= n; i++) 26 rs = rs * (k - i + 1) / i; 27 return rs; 28 } 29 static int Bingo(int type) { 30 int fenmu; 31 switch (type) { 32 case 1: 33 fenmu = 1; // 6+1 1/c33(6)*c16(1) 34 break; 35 case 2: 36 fenmu = 15; // 6+0 c15(1)/c33(6)*c16(1) 37 break; 38 case 3: 39 fenmu = 6 * 27; // 5+1 c6(5)*c27(1)/c33(6)*c16(1) 40 break; 41 case 4: 42 fenmu = C(6, 5) * C(27, 1) * C(15, 1) + C(6, 4) * C(27, 2); // 5+0 & 43 // 4+1 44 // (c6(5)*c27(1)*c15(1)+c6(4)*c27(2))/c33(6)*c16(1) 45 break; 46 case 5: 47 fenmu = C(6, 4) * C(27, 2) * C(15, 1) + C(6, 3) * C(27, 3); // 4+0 & 48 // 3+1 49 // (c6(4)*c27(2)*c15(1)+c6(3)*c27(3))/c33(6)*c16(1) 50 break; 51 case 6: 52 fenmu = C(6, 2) * C(27, 4) + C(6, 1) * C(27, 5) + C(27, 6); 53 break; 54 default: 55 fenmu = 0; 56 break; 57 } 58 return start2generateBalls() / fenmu; 59 } 60 public static void main(String[] args) { 61 System.out.println("[双色球一等奖中奖几率] -> [1/" + Bingo(1) + "]\n亲,500w!"); 62 System.out.println("[双色球二奖中奖几率] -> [2/" + Bingo(2) + "]\n亲,166w!"); 63 System.out.println("[双色球三等奖中奖几率]-> [1/" + Bingo(3) + "]\n亲,3000元"); 64 System.out.println("[双色球四等奖中奖几率]-> [1/" + Bingo(4) + "]\n亲,没中过"); 65 System.out.println("[双色球五等奖中奖几率]-> [1/" + Bingo(5) + "]\n亲,求安慰"); 66 System.out.println("[双色球末等奖中奖几率]-> [1/" + Bingo(6) + "]\n亲,月月都来一次!"); 67 } 68 }