問題出自:
http://topic.csdn.net/u/20090518/21/8b96f19a-af92-4eb8-8021-2977c29f27d2.html#replyachor
http://topic.csdn.net/u/20090524/15/485d92e2-759e-496c-8725-fab7862ab5d2.html
但在這裏對題目作了修改,增加了些難度。
--
r個紅球和b個藍球。
A,B輪流取球:A每次從箱子裏隨機取出一個球,B每次從箱子裏取出一個藍球。
當如下兩種情況之一發生時A勝:
(1),最後一個取出的球是藍球。
(2),剩餘的紅球比藍球恰多兩個。
否則B勝。
問:若給定r,b值及A,B誰先取,求A獲勝的概率。
解:(matlab代碼)
(一)遞歸解法:
function rs=g(r,b,guy) %計算“有r個紅球,b個藍球,guy先取”時A獲勝的概率 if guy=='A' if r-2==b rs=1; return; end if r==0&&b==0 rs=0; return; end if r==0&&b>=1 rs=1; return; end if r>=1&&b==0 rs=0; return; end if r>=1&&b>=1 rs=g(r-1,b,'B').*r./(r+b)+g(r,b-1,'B').*b./(r+b); return; end elseif guy=='B' if r-2==b rs=1; return; end if r==0&&b==0 rs=0; return; end if r==0&&b>=1 rs=1; return; end if r>=1&&b==0 rs=0; return; end if b>=1&&r>=1 rs=g(r, b-1,'A'); return; end end end |
例:
>> g(3,10,'A')
ans =
0.4386
(二)動態規劃解法:
將A,B輪流取球的過程看作離散隨機過程(馬爾可夫鏈)。
function rsp=f(r,b,guy) %計算“有r個紅球,b個藍球,guy先取”時A獲勝的概率 %最初狀態空間p只有(i_(r),j_(b))格有概率值(爲1),其餘格均爲0 p(i_(r),j_(b))=1; rsp=0; %開始進行狀態轉移 count=0;%計數取球已進行了多少次 while(1) tp=p;%以tp接管當前狀態空間,騰出p來存放下一狀態空間 p=zeros(size(p));%將p清零 %用tp去渲染p %遍歷tp的每一個格 for i=0:size(tp,1)-1 for j=0:size(tp,2)-1 %tp(i_(i),j_(j))將散射到p的若干個格上對其概率值作出貢獻 if guy=='A'%如果是A取球 %tp(i_(i),j_(j))轉移到p(i_(i-1),j_(j))和p(i_(i),j_(j-1)),爲其概率值作出貢獻 %要注意渲染不要出格 if i>=1&&i+j~=0;p(i_(i-1),j_(j))=p(i_(i-1),j_(j))+i./(i+j)*tp(i_(i),j_(j));end if j>=1&&i+j~=0;p(i_(i),j_(j-1))=p(i_(i),j_(j-1))+j./(i+j)*tp(i_(i),j_(j));end elseif guy=='B'%如果是B取球 %tp(i_(i),j_(j))轉移到p(i_(i),j_(j-1)),爲其概率值作出貢獻 %要注意渲染不要出格 if j>=1;p(i_(i),j_(j-1))=p(i_(i),j_(j-1))+tp(i_(i),j_(j));end end end end%p渲染完畢 %將終止點概率計入並清零 for i=0:size(p,1)-1 for j=0:size(p,2)-1 if i-2==j||(i==0&&j~=0) rsp=rsp+p(i_(i),j_(j)); p(i_(i),j_(j))=0;%注意,終止狀態每次都要清零 end end end %換人 if guy=='A' guy='B'; else guy='A'; end count=count+1; if count==r+b%在r+b次以內遊戲必定已結束,故此時rsp必已經將所有可能的p(i_(0),j_(1))全部計入。終止。 break; end end end |
其中用到兩個輔助函數,作用是將下標從1開始(matlab特性)變換爲下標從0開始:
function newivalu=i_(ivalu) newivalu=ivalu+1; end function newivalu=j_(ivalu) newivalu=ivalu+1; end |
例:
>> f(3,10,'A')
ans =
0.4386
(三),模擬解法:
function rs=f(Nr,Nb,firstguy,rep) |
例:
>> f(3,10,'A',100000)
ans =
0.4383