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) 我只是在把它转换成代码时遇到了麻烦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
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。至少这是我对这个问题的理解……好吧,我不知道。这是我很久以前就记得它是如何工作的。对不起,我的问题或多或少强调了“为什么”部分。为什么这些函数要简化成这样?你用的是什么样的数学方法?如果这些是简单的伯努利试验,那就没有意义了(这可能是我挂断电话的原因)。