Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归多掷骰子的概率_Java - Fatal编程技术网

Java 递归多掷骰子的概率

Java 递归多掷骰子的概率,java,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

我将如何使用递归来计算使用给定数量的骰子滚动某个数字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(整数骰子,整数r){
int-ret=1;
对于(int i=2;i<7;i++){
ret=(1/6)(ret*(dice-i))/(i+1);
}
返回ret;
}  
静态双掷骰子(整数骰子,整数r){
如果(骰子==1&&(r6)){
返回0;
}

如果(dice==1&&(r>=1&&r我不明白为什么你必须将方法
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)
i、 e.在一般情况下

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


编辑:单击查看完整示例,比较以验证结果。

我不明白为什么必须将方法
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)
i、 e.在一般情况下

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


编辑:点击查看完整的示例,比较以验证结果。

我已经有一段时间没有做统计工作了,但是你用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)等等,直到我们得到骰子=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)等等,直到我们得到骰子=1。至少这是我对这个问题的理解……好吧,我不知道。这是我很久以前就记得它是如何工作的。对不起,我的问题或多或少强调了“为什么”部分。为什么这些函数要简化成这样?你用的是什么样的数学方法?如果这些是简单的伯努利试验,那就没有意义了(这可能是我挂断电话的原因)。