取球遊戲

問題出自:

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)
%模擬計算“有Nr個紅球,Nb個藍球,firstguy先取”時A獲勝的概率,rep爲實驗次數
%如果輸入爲特殊情況,則直接得出結果,無需模擬
if Nr==0&&Nb==0
    rs=0;
    return;
end
if Nr-2==Nb
    rs=1;
    return;
end
if Nr==0&&Nb>0
    rs=1;
    return;
end
if Nr>0&&Nb==0&&~(Nr-2==Nb)
    rs=0;
    return;
end
%進行模擬
NAwin=0;%A勝次數
for i=1:rep%重複遊戲rep次
    %遊戲初始狀態
    r=Nr;
    b=Nb;
    guy=firstguy;
    %A,B輪流取球
    while(1)
        if guy=='A'%輪到A取球
            k=floor(rand()*(r+b))+1;%隨機數k用於選球
            if k>r%取藍球
                b=b-1;
                if r==0&&b==0%如果A剛取的這個藍球爲最後一個球,遊戲結束,A勝。
                    NAwin=NAwin+1;
                    break;
                end
            else%取紅球
                r=r-1;
                if r==0&&b==0%如果A剛取的這個紅球爲最後一個球,遊戲結束,B勝。
                    break;
                end
            end
            if r-2==b%如果滿足條件(2),遊戲結束,A勝。
                NAwin=NAwin+1;
                break;
            end
            guy='B';%換人
        elseif guy=='B'%輪到B取球
            b=b-1;%B只取藍球
            if r==0&&b==0%如果B剛取的這個藍球爲最後一個球,遊戲結束,A勝。
                NAwin=NAwin+1;
                break;
            end
            if r-2==b%如果滿足條件(2),遊戲結束,A勝。
                NAwin=NAwin+1;
                break;
            end
            guy='A';%換人
        end
    end
end
rs=NAwin./rep;%得到概率
end

 

例:

>> f(3,10,'A',100000)

ans =

    0.4383

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章