喝酒搖骰子概率


昨晚喝酒搖骰子,喝了不少酒。為了少喝點寫個簡單代碼計算下搖色子概率。

規則:

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;
    }


}

  

 下面是八個人玩跑的結果:

 

 

 在知道自己搖到骰子個數的情況下,叫多少個的概率

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM