具有递归的多个骰子的概率

时间:2013-04-25 07:00:42

标签: java

如何使用递归来计算使用给定数量的骰子滚动某个数字r的概率?我试图将此视为一个选择问题,但我仍然对算法应如何工作感到困惑。

例如,它应该是这样的:

P(4,14)=(1/6)P(3,13)+(1/6)P(3,12)+(1/6)P(3,11)+(1/6 )p(3,10)+(1/6)p(3,9)+(1/6)p(3,8)

P(3,8)=(1/6)P(2,7)+(1/6)P(2,6)+(1/6)P(2,5)+(1/6 )P(2,4)+(1/6)P(2,3)+(1/6)P(2,2)

P(2,4)=(1/6)P(1,3)+(1/6)P(1,2)+(1/6)P(1,1)+(1/6 )p(1,0)+(1/6)p(1,-1)+(1/6)p(1,-2)

=(1/6)(1/6)+(1/6)(1/6)+(1/6)(1/6)+(1/6)(0)+(1/6 )(0)+(1/6)(0)

我在将其转换为代码时遇到了麻烦。

static double P(int dice, int r) {
int ret = 1;
for (int i = 2; i < 7; i++) {
     ret = (1/6)(ret*(dice-i))/(i+1);
}
return ret;
    }  

static double RollDice(int dice,int r) {
     if (dice==1 && (r<1 || r>6)){ 
     return 0;
     }
     if (dice==1 && (r>=1 && r<=6)){
        return (1.0/6);
     }

     else {
        return ((1.0/6)*P(dice-1,r-1));
     }

1 个答案:

答案 0 :(得分:1)

我不明白为什么你必须将方法P()RollDice()分开,因为在你的公式中,你(正确地)用P来描述所有方法。

如果您要将公式放入代码中,它应该如下所示:

编辑:将基本案例更改为0骰子,从那时起变得更加简单。

static double P(int dice, int r) {
    if (dice == 0) {
        // Zero dice: probabiliy 1 to get 0
        if (r == 0) {
            return 1.0;
        } else {
            return 0.0;
        }
    else {
        // Multiple dice: recursion
        double sum = 0.0;
        for (/* TODO */) {
            sum += //TODO
        }
    }
}

对于递归部分,请尝试查看公式:

P(4, 14) = (1/6)P(3, 13) + (1/6)P(3, 12) + ... + (1/6)P(3, 8)

即。在一般情况下

P(dice, r)=(1/6)P(dice-1, r-1) + (1/6)P(dice-1, r-2) + ... + (1/6)P(dice-1, r-6)

意味着您必须从r-6循环到r-1

由于你在多个递归调用上得到了一个总和,你必须使用一个初始化为0的累加器。(我调用的变量sum

编辑:点击here获取完整示例,与WolframAlpha进行比较以验证结果。