题目:
概率问题
某个袋子中有红球m个,白球n个。现在要从中取出x个球。那么红球数目多于白球的概率是多少呢?
下面的代码解决了这个问题。其中的y表示红球至少出现的次数。
这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。请根据仅存的线索,判断程序逻辑,并补全缺少的代码。
m:袋中红球的数目
n:袋中白球的数目
x:需要取出的数目
y:红球至少出现的次数
#include <stdio.h> /* @param m 红球个数 @param n 白球个数 @param x 欲取球数 @param y 至少要取的红球数 */ double res(int m,int n,int x,int y){ // 当前取一个红球的概率 double p1; // 当前取一个白球的概率 double p2; //递归结束情况 if(m<y) return 0; if(x<y) return 0; if(y==0) return 1; if(x-n>y) return 1; // 递归不断求解 //取到一个红球 p1 = res(m-1, n, x-1, y-1); //取到一个白球 p2 = res(m,n-1,x-1,y); return (double)m/(n+m)*p1 + (double)n/(m+n)*p2 ; } int main() { printf("请输入红球个数,白球个数,想要取的球数:\n"); int m,n,x,y; scanf("%d%d%d",&m,&n,&x); y = x/2 + 1; double result = res(m,n,x,y); printf("%lf\n",result); return 0 ; }
时间: 2024-10-12 14:52:24