• 喝酒摇骰子概率


    昨晚喝酒摇骰子,喝了不少酒。为了少喝点写个简单代码计算下摇色子概率。

    规则:

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

      

     下面是八个人玩跑的结果:

     在知道自己摇到骰子个数的情况下,叫多少个的概率

     
  • 相关阅读:
    redis操作
    MySQL架构
    MySQL查询缓存
    MySQL数据备份与还原
    Sql性能优化
    Notepad++中每一行的开头和结尾添加引号?
    分组聚合
    Python3用scan和delete命令批量清理redis数据
    VUE+django
    python转化13位时间戳
  • 原文地址:https://www.cnblogs.com/chenfx/p/15226515.html
Copyright © 2020-2023  润新知