【问题标题】:Probability of multiple dice rolls with recursion递归多次掷骰子的概率
【发布时间】:2013-04-25 15:59:19
【问题描述】:

我将如何使用递归来计算用给定数量的骰子滚动某个数字 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));
     }

【问题讨论】:

  • 我已经有一段时间没有做统计工作了,但是你用 P(4, 14) 断言什么?为什么划定出现在 (3, 8) 和 (2, 4) 周围?我很困惑。
  • 看起来像家庭作业 ;) 你的任务的完整文本是什么。我不太确定在滚动和计数中将递归放在哪里
  • 通过使用递归,我们可以将问题简化为单个骰子在 1 - 6 之间掷出 # 的概率。因此,P(4, 14) 可以表示为 (1 /6)P(3,13) - (1/6)P(3,8) 可以再次表示为 (1/6)P(2,7) 等等,直到我们得到 dice = 1。至少这是我对问题的理解......
  • 好吧,我出去了。很久以前我就记得它是如何工作的。对不起
  • 我的问题或多或少是强调它的“为什么”部分。为什么这些功能会减少到那个程度?你使用什么样的数学方法?如果这些只是简单的伯努利试验,那是没有意义的(这可能是我最感兴趣的)。

标签: java


【解决方案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比较以验证结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多