昨晚喝酒摇骰子,喝了不少酒。为了少喝点写个简单代码计算下摇色子概率。
规则:
1、一点可以当成1点或者其他任意点数。
2、每人蛊中有5个骰子。
3、从低往高叫全场最少有多少个数字num点数。
double p = 0; while (num <= dice){ p += Math.pow(1 / 6.0, num) * Math.pow(5 / 6.0, dice - num) * arrange(num,dice); num++; }
点数大于等于num出现的概率相加。
public class Test { public static void main(String[] args) { double p2 = caculateProbability1(6, 8 * 5); double p1 = caculateProbability1(7, 8 * 5); //人头一 double p = caculateProbability1(8, 8 * 5); double p3 = caculateProbability1(9, 8 * 5); double p32 = caculateProbability2_6(10, 8 * 5); double p33 = caculateProbability2_6(11, 8 * 5); double p34 = caculateProbability2_6(12, 8 * 5); double p35 = caculateProbability2_6(13, 8 * 5); double p4 = caculateProbability2_6(14, 8 * 5); double p5 = caculateProbability2_6(15, 8 * 5); double p6 = caculateProbability2_6(16, 8 * 5); double p7 = caculateProbability2_6(17, 8 * 5); //返回叫10-20的概率 double[] pa0 = stragety1(8 * 5,0); double[] pa1 = stragety1(8 * 5,1); double[] pa2 = stragety1(8 * 5,2); double[] pa3 = stragety1(8 * 5,3); double[] pa4 = stragety1(8 * 5,4); double[] pa5 = stragety1(8 * 5,5); //返回叫5-10的概率 double[] pa01 = stragety2_6(8 * 5,0); double[] pa11 = stragety2_6(8 * 5,1); double[] pa21 = stragety2_6(8 * 5,2); double[] pa31 = stragety2_6(8 * 5,3); double[] pa41 = stragety2_6(8 * 5,4); double[] pa51 = stragety2_6(8 * 5,5); System.out.println(p); } /** * 策略概率集合,已有1数字个数 * */ private static double[] stragety1(double dice, double myNum) { double[] doubles = new double[6]; for (int i = 5; i <= 10; i++) { doubles[i-5] = Math.round(caculateProbability1(i-myNum,dice-5) * 100)/100.0; } return doubles; } /** * 策略概率集合,已有2-6数字个数 * */ private static double[] stragety2_6(double dice, double myNum) { double[] doubles = new double[11]; for (int i = 10; i <= 20; i++) { doubles[i-10] = Math.round(caculateProbability2_6(i-myNum,dice-5) * 100)/100.0; } return doubles; } /** * 计算骰子出现1点的概率 * */ private static double caculateProbability1(double num, double dice) { double p = 0; while (num <= dice){ p += Math.pow(1 / 6.0, num) * Math.pow(5 / 6.0, dice - num) * arrange(num,dice); num++; } return p; } /** * 计算骰子出现2-6点的概率 * */ private static double caculateProbability2_6(double num, double dice) { double p = 0; while (num <= dice){ p += Math.pow(2 / 6.0, num) * Math.pow(4 / 6.0, dice - num) * arrange(num,dice); num++; } return p; } /** * 计算排列组合情况 * n 总数 * m 需要排列的元素个数 * */ private static double arrange(double m, double n){ if (m > n/2){ m = n - m; } double arrange = 1; while (m > 0){ arrange *= n / m; m--; n--; } return arrange; } }