2013-10-18 152 views
1

我有一個機器人玩的遊戲程序。爲了簡單起見,遊戲有2個按鈕 - 「贏」和「再試」。爲了獲勝,機器人必須簡單地推動「贏」按鈕。如何使可能性隨着時間的推移隨着時間的推移而增加

的遊戲涉及的是開始於10,並運行至0,每秒一次滴答倒數計時器。在計時器的每次打勾期間,機器人會選取兩個按鈕中的一個。當計時器在10時,機器人點擊贏的機會非常小。隨着計時器接近0,機器人點擊「贏」按鈕的機會增加。當然,機器人可能永遠不會點擊win按鈕。

什麼,我到底追求的是機器人點擊「贏」約90%的與時間贏得點擊進行加權接近定時器0被

我做了一些概率研究(絕對新手),我的理解是,在每個時間點的概率總和應高達0.90,以獲得我想要的結果。例如:

countdownTimerTickNumber | probabilityOfClickingWin 
==================================================== 
10 | 0 
9 | 0.0001 
8 | 0.005 
7 | 0.01 
6 | 0.02 
5 | 0.04 
4 | 0.08 
3 | 0.1 
2 | 0.15 
1 | 0.2 
0 | 0.294 
---------------------------------- 
Total probabilityOfClickingWin over all ticks: .9 

下面是一些僞代碼來顯示如何使用的概率從表格上方實際確定哪個按鈕機器人點擊。它每滴答期間被稱爲:

function bool doClickWin(probabilityOfClickingWin) 
{ 
    if (probabilityOfClickingWin >= new Random().NextDouble()) 
      return true; 

    return false; 
} 

但是,如果我跑我的程序很多次,我發現的機器人點擊「贏」時的實際比例遠低於90%(約60%)。

誰能告訴我我做錯了什麼?提前致謝。

+0

我已經打消了我的意見,因爲它有不準確的,但想法是正確的。什麼擰你的邏輯是'probabilityOfClickingWin'和它的計算方式。爲了得到期望的概率,它需要是'probability * maxRandomNumberThatCanBeReturned'。因爲'Random.NextDouble'返回最大值'1.0d',所以你需要傳遞'0.9d'來獲得90%的返回'true'。這裏的示例:http://ideone.com/a8wxw6更高級的嘗試更加準確地成爲結果。還要靜態保留Random對象([_reason_](http://stackoverflow.com/a/10598041/1283847)) – Leri

+0

Leri - 它看起來像您樣本中的CompareWithRandom()將返回true〜90%的時間迭代「嘗試」。這其實不是我所需要的。我需要它,所以對於所有「嘗試」迭代的組合,CompareWithRandom()只有一次返回真的概率爲90%。但是,感謝您抽出時間。 – Don

回答

4

概率計算比您想象的要複雜得多。獲勝的概率是

P(win on 0th tick) + P(win on 1st tick) + ... + P(win on 10th tick) 

我們稱之爲概率p(0)... p(11)。然後

P(win on 0th tick) = p(0) 
P(win on 1st tick) = (1-p(0)) * p(1) 
P(win on 2nd tick) = (1-p(0)) * (1-p(1)) * p(2) 

等在每一跳,你對蜱贏的概率是,你尚未在任何先前的蜱獲勝的概率乘以贏得現在的概率。我認爲你的機器人應該贏得大約63.17%的時間(我不確定你爲什麼看到大約30% - 這可能是你程序中其他某個地方的bug嗎? )

用下面的號碼,你應該觀察大約90%的成功率整體

0  0 
1 0.0068 
2 0.0113 
3 0.0188 
4 0.0314 
5 0.0524 
6 0.0875 
7 0.1459 
8 0.2433 
9 0.4059 
10 0.6771 

編輯

我是如何拿出這些數字的?試錯。但是我們可以創建一個給定任何獲勝概率的過程,爲每個時間點生成一組合適的概率。

比方說,總的獲勝概率是Q,所以你要

P(Win on 0th tick) + ... + P(Win on 10th tick) = Q 

比方說,我們希望這是沒有機會一號蜱獲勝,和線性增加任何蜱勝算之後。所以概率必須加起來爲Q,並且得分爲i的勝利概率與i成正比。因此

P(Win on ith tick) = const * i 

因此

c * 0 + c * 1 + c * 2 + ... + c * 10 = Q 

=> 55 * c = Q 

=> c = Q/55 

這給了我們

P(Win on 0th tick) = 0 
P(Win on 1st tick) = Q/55 
P(Win on 2nd tick) = 2*Q/55 

等,現在你使用這些使用公式在後頂部,以確定每個p(i)的。我們有

p(0) = P(win on 0th tick) = 0 
p(1) = P(win on 1st tick)/(1-p(0)) = Q/55 
p(2) = P(win on 2nd tick)/(1-p(0))/(1-p(1)) = 2*(Q/55)/(1-Q/55) 

等這裏是一個Matlab例程,計算概率;它不應該很難翻譯成C#或任何你使用的。

N = 10; 
Q = 0.9; 
p = zeros(N+1,1); 

for i = 1:N 
    p(i+1) = i * Q/(0.5*N*(N+1))/prod(1-p(1:i)); 
end 

這給這個結果

0   0 
1 0.0164 
2 0.0333 
3 0.0516 
4 0.0726 
5 0.0978 
6 0.1301 
7 0.1745 
8 0.2416 
9 0.3584 
10 0.6207 
+0

你是對的,我正在變得〜60%。它看起來像你看到我的問題,但你能向我解釋或給我一個確切的公式,你如何得到你的每個勾號的概率?實際上有很多機器人,他們有不同的概率(不僅僅是90%),所以我需要能夠從機器人的總概率向後工作,以確定每個機器人每次打勾的概率。我嘗試用你的代碼片斷來解決它,但是我被卡住了(例如'P(在第一次打勾時贏)=(1-p(0))* p(1)' - 但不是'P第一個滴答聲)'和'p(1)'在這一行中是否相同?)。 Thx再次。 – Don

+1

概率'p(i)'是你贏得這個剔的概率,*如果我們已經達到它*。但是你並不總是達到那個點,因爲你可能會贏得較早的點數。概率P(在第i個tick上獲勝)是你的機器人在第i個節拍上獲勝的總概率。這些是互斥的,所以可以添加它們以獲得總贏率。 –

+0

我到達郵件中的號碼的方式很簡單,就是反覆試驗。我會做一個編輯,給你一個更具體的程序來確定在每個時間點的概率。 –

相關問題