http://topic.csdn.net/u/20090518/21/8b96f19a-af92-4eb8-8021-2977c29f27d2.html#replyachor
一个箱子里有r个红球和b个蓝球,球的个数之和是奇数。A和B一起玩一个游戏,首先A从箱子里随机取出一个球(取到每个球的概率是一样的),然后B从箱子里取出一个蓝球,依次进行下去。
当轮到B取时,箱子里没有可取的蓝球,则B获胜;如果最后一个从箱子里取出的球是蓝球,则A获胜,否则B获胜。
问:给出红球的个数r和蓝球的个数b,求A获胜的概率?
如下代码:
#include <iostream> using namespace std; double result=0; double pa[1001][4000]={0}; double getProbability(int red,int blue) { if(red>blue) return 0; if(red>1000) return 0; if(red==0) return 1; if(blue==0) return 0; if(pa[red][blue]) return pa[red][blue]; 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]; }
还有一种想法。
全排列。因为,取球是按序的,那么该取球过程可以“序列化”,哈哈。
首先,b > r
全部取球的情况,是 A ( ( r + b - 1 ) / 2, b ) * A ( ( r + b + 1 ) / 2 ) <式一> 。(坎儿妹提出来修改)
A 获胜的情况是最后一个为蓝球并有 ( r + b - 1 ) / 2 个蓝球为B拿的情况
C( 1, b ) * [ C ( ( r + b - 1 ) / 2, b - 1 ) * A ( ( r + b - 1 ) / 2 ) ] * A ( ( r + b - 1 ) / 2 ) <式二>
结果为<式二>/<式一> = ( b - r + 1 ) / ( b + r + 1 )