请教一道概率题

allen303allen 2009-05-18 09:05:19
加精
一个箱子里有r个红球和b个蓝球,球的个数之和是奇数。A和B一起玩一个游戏,首先A从箱子里随机取出一个球(取到每个球的概率是一样的),然后B从箱子里取出一个蓝球,依次进行下去。

当轮到B取时,箱子里没有可取的蓝球,则B获胜;如果最后一个从箱子里取出的球是蓝球,则A获胜,否则B获胜。

问:给出红球的个数r和蓝球的个数b,求A获胜的概率?



感觉应该dp,谁能详细讲一下?
...全文
1448 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
chadguo 2010-11-04
  • 打赏
  • 举报
回复
最后一个从箱子里取出的球是蓝球,则A获胜----这是A获胜的条件;由于r和b的和为奇数,所以r不等于b,则有r>b,r<b两种情况,如果r>b,即使A一直取红球最后取到的球也不可能是蓝球,所以A获胜的情况只有是r<b;在r<b的情况下,r和b的和为奇数也说明最后一个取球的人是A,要保证A最后取到的是蓝球,就是要在前r+b-1次取球中取到了r个红球,这种情况好像与概率论中的一个经典例题很相似,就是那个什么次品、良品的吧,具体记不得了
jdtxse 2010-05-20
  • 打赏
  • 举报
回复
学习之
yuandong300 2009-12-22
  • 打赏
  • 举报
回复
好帖子,非常值得学习
over301 2009-11-17
  • 打赏
  • 举报
回复
不错的帖子
kdjqssl 2009-05-21
  • 打赏
  • 举报
回复
红球:r
蓝球: b

r>b: 概率为0。
r<b:
若要A胜利,最后一个必须是蓝球,也就是说,前面拿 r+b-1 一个球中有 b-1 个蓝球和 r个红球.
此时A、B各拿球数是(r+b-1)/2. B拿的全部都是蓝球。那么:A拿 r 个红球和 (r-b-1)/2个蓝球。
(r+b-1)/2 中有 r个红球的 C [r][(r+b-1)/2] 也就是(r+b-1)/2)! / r!( b-r-1)/2)!种情况,这里是获胜的拿法。
而A总的拿法是从(r+b-1)/2 +1 个中拿(r-b-1)/2 + 1 个蓝球和r个红球:C [r][(r+b+1)/2],也就是
(r+b+1)/2)! / r!( b-r+1)/2)!

所以A获胜的概率是 C [r][(r+b-1)/2] / C [r][(r+b+1)/2] = (b-r+1)/(b+r+1) = 1- 2r/(b+r+1)

因为B固定拿蓝色的,所以不用考虑B的情况。只要知道B拿了(r+b-1)/2个蓝球就行。
就只要讨论A的情况了 A拿(r+b-1)/2 +1 个球 要想 最后一个篮球,就是前面(r+b-1)/2必须只能拿(r-b-1)/2个。
获胜的拿法 / 总的拿法 = 获胜概率
iwantnon 2009-05-21
  • 打赏
  • 举报
回复
公式怎么没出来??
完整公式为:
初始:p(m,n,A)=1
递推:
p(r,b,A)=p(r,b+1,B)
p(r,b,B)=(r+1)/(r+1+b)*p(r+1,b,A)+(b+1)/(r+b+1)*p(r,b+1,A)
目标:P=p(0,1,A)+p(0,1,B)
iwantnon 2009-05-21
  • 打赏
  • 举报
回复
接楼要求A胜的概率,而A获胜当且仅当最后一个拿走的球是蓝球,即如下两种情况:
(0,1,A)
(0,1,B)
所以所求概率为:P=p(0,1,A)+p(0,1,B)
另外假设最初状态为r=m,b=n,A先拿,则有初始条件:
p(m,n,A)=1
综上述,完整公式为:
初始:p(m,n,A)=1
递推:
p(r,b,A)=p(r,b+1,B)
p(r,b,B)=(r+1)/(r+1+b)*p(r+1,b,A)+(b+1)/(r+b+1)*p(r,b+1,A)
目标:P=p(0,1,A)+p(0,1,B)


iwantnon 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 allen303allen 的帖子:]
一个箱子里有r个红球和b个蓝球,球的个数之和是奇数。A和B一起玩一个游戏,首先A从箱子里随机取出一个球(取到每个球的概率是一样的),然后B从箱子里取出一个蓝球,依次进行下去。
当轮到B取时,箱子里没有可取的蓝球,则B获胜;如果最后一个从箱子里取出的球是蓝球,则A获胜,否则B获胜。
问:给出红球的个数r和蓝球的个数b,求A获胜的概率?
感觉应该dp,谁能详细讲一下?
[/Quote]
用p(r,b,A)表示状态“箱子里有r个红球,b个蓝球,且轮到A取”出现的概率。
用p(r,b,B)表示状态“箱子里有r个红球,b个蓝球,且轮到B取”出现的概率。
那么递推式:
p(r,b,A)=p(r,b+1,B)
p(r,b,B)=(r+1)/(r+1+b)*p(r+1,b,A)+(b+1)/(r+b+1)*p(r,b+1,A)
另外根据红字部分知,所求目标为:
...下课了,我晚上再接着写!!
iwantnon 2009-05-21
  • 打赏
  • 举报
回复
各位的数据到底达成一致了没有?
这个题目的结果到底是多少?
瓶盒 2009-05-20
  • 打赏
  • 举报
回复
不错的问题,支持37楼,就是过于简洁,自已不动手写下很难理解。
chenchangxiong 2009-05-20
  • 打赏
  • 举报
回复
假设A取一次再B取一次为一步
假设剩下r个红球,q个篮球,一步操作后,可能有2种情况剩下r-1个红球 q-1个篮球
或者 剩下r个红球,q-2个篮球
第一种概率为r/(r+q),第二种为q/(r+q)

现在若剩下x个红球,y个篮球,则可知它可能从x+1个红球,y+1个篮球进行一步操作来,也可能从
x个红球,y+2个篮球来,概率计算公式为
p(x,y) = (x+1)/(x+y+2) p(x+1,y+1) + (y+2)/(x+y+2) p(x,y+2)............(1)

可得伪代码如下:
p[r, s] = {0};
p(r,s) = 1;
AWin = 0;
for(int i = 1; i < max(r/2, s/2); i++)
{
for(j = 0; j <= i; j++) //这个可以用2个堆栈来操作优化
{
由公式(1)计算p(r - j, q - 2*i +j),注意p(x,y)若x,y不在r,s范围内,p(x,y)为0;
}
}
AWin = p(0,1);
chenchangxiong 2009-05-20
  • 打赏
  • 举报
回复
比如有4个红球 3个篮球 无论如何B必输
错了 B必赢 呵呵 看错看错
chenchangxiong 2009-05-20
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 arong1234 的回复:]
实际上我还把它做复杂了,根据

"当轮到B取时,箱子里没有可取的蓝球,则B获胜;如果最后一个从箱子里取出的球是蓝球,则A获胜,否则B获胜。"

B获胜必然结论是最后一个球为红色,而A获胜的必然结果就是最后一个球是蓝色。因此A获胜概率其实是b/(r+b),B获胜的概率r/(r+b)

回到我原来做法,
a) 总的排法是(r+b)!/r!/b!
b) 最后两个一蓝一红的方法有(r+b-2)!/(r-1)!/(b-1)!, 最后两个红色情况有(r+b-2)!/b!/(r-2)!
因此…
[/Quote]
你的算法肯定错的
lz的题目是首先A从箱子里随机取出一个球(取到每个球的概率是一样的),然后B从箱子里取出一个蓝球
b是取蓝球 而不是随机取球
比如有4个红球 3个篮球 无论如何B必输
瓶盒 2009-05-20
  • 打赏
  • 举报
回复
尝试了一下,如果球数过大,动态建表比递归方式效率高得多。
#define MAXRED 4011
#define MAXBLUE 8010
double f[MAXRED][MAXBLUE]={0};
double TabSelectBall(int redBall, int blueBall)//返回A获胜的概率
{
int i,j;
for(j=1;j<=blueBall;j++)//所有红球为0的情况,概率为1
f[0][j]=1.0;
for(i=1;i<=redBall;i++)
for(j=0;j<i;j++)
f[i][j]=0.0;
for(int i=1;i<=redBall;i++)
for(int j=i+1;j<=blueBall;j+=2)//蓝球数必须要大于红球数才不为0,
f[i][j]=(f[i-1][j-1]*i+f[i][j-2]*j)/(i+j);
return f[redBall][blueBall];
};
arong1234 2009-05-20
  • 打赏
  • 举报
回复
假定A获胜的概率是P(r,b)为简化推导,令P(r,b) =0, if r<0 or b<0

1. P(0,1) = 0
2. P(1,0) = 1
3. P(1,2) = 1/2
4. P(r,b) = P(r-1,b-1)/2 + P(r,b-2)/2

--第一部分代表A首先取走一个红球的概率,后者代表A先取一个篮球的概率

P(r,b) = P(r-1,b-1)/2 + P(r,b-2)/2
= P(r-2,b-2)/4 + P(r-1,b-3)/4 + P(r-1,b-3)/4 + P(r,b-4)/4
= P(r-2,b-2)/4 + P(r-1,b-3)/2 + P(r,b-4)

经过N轮迭代后,显然结果是这样的
P(r,b)是P(r-m,b-n)的一个线性和,且m+n=2N,m从0到N, n从N到2N,各项的系数是(1/2+1/2)^N的二项式展开各项
因此P(r,b)的第N次展开为
P(r,b) = 2^(-N) sum(n=0...,N, C(N,n)*P(r-n,b-2N+n))












arong1234 2009-05-20
  • 打赏
  • 举报
回复
You are right. 我以为是A,B都随机取呢

[Quote=引用 47 楼 chenchangxiong 的回复:]
引用 34 楼 arong1234 的回复:
你的算法肯定错的
lz的题目是首先A从箱子里随机取出一个球(取到每个球的概率是一样的),然后B从箱子里取出一个蓝球
b是取蓝球 而不是随机取球
比如有4个红球 3个篮球 无论如何B必输

[/Quote]
haoweishow01 2009-05-20
  • 打赏
  • 举报
回复
高数据结构,概率也要学好啊。。。。
keaiting 2009-05-20
  • 打赏
  • 举报
回复
提问37楼,不明白 return (f(r-1, b-1)*r+f(r, b-2)*b)/(r+b);这一句的意思。
我用r=2,b=3自己的方法计算了一下:
B赢有两种情况:最后两个是蓝,红,总共有:C_3^1*C_2^1*C_2^1*A_2^2=24种方法(C_3^1表示的是组合)
最后两个是红,红,总共有:A_3^3*A_2^2=12种方法
然后所有的排列情况是:(2+3)!=120种。
所以B赢的概率是:(24+12)/120=0.3,
A赢的概率是:0.7。
和你的结论不一样。



[Quote=引用 37 楼 tian428 的回复:]
C/C++ codedouble f(int r, int b)
{
if(r>b)
return 0;
if(r==0)
return 1;
return (f(r-1, b-1)*r+f(r, b-2)*b)/(r+b);
}



写成递归代码貌似就几行...
测试
[tian@localhost ctest]$ ./a.out 10 3
0.000000
[tian@localhost ctest]$ ./a.out 3 10
0.207792
[tian@localhost ctest]$ ./a.out 1 2
0.333333
[tian@localhost ctest]$ ./a.…
[/Quote]
morilasi 2009-05-20
  • 打赏
  • 举报
回复
上代码吧。。SRM408 DIV2 1000
#include <iostream>
using namespace std;
double result=0;
double pa[1001][4000]={0};
class MarblesInABag
{
public:
double getProbability(int red,int blue)
{
if(red>blue) return 0;
else if(red>1000) return 0;
else if(red==0) return 1;
else if(blue==0) return 0;
else if(pa[red][blue]) return pa[red][blue];
else{
double a=(double)(red)/(double)(red+blue);
double b=(double)(blue)/(double)(red+blue);
pa[red][blue]=a*getProbability(red-1,blue-1)+b*getProbability(red,blue-2);
return pa[red][blue];
}
}
};


当a>b时,最后一个一定不是蓝球
当a>1000时,概率很小。。可以忽略。
加载更多回复(46)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧