如何通过可预测的结果使概率随时间增加

时间:2013-10-18 06:41:52

标签: c# statistics probability

我有一个由机器人玩的游戏程序。为简单起见,游戏有2个按钮 - “赢”和“再试一次”。要获胜,机器人必须只需按下“赢”按钮。

游戏涉及一个倒数计时器,从10开始并运行到0,每秒滴答一次。在计时器的每个滴答声中,机器人选择两个按钮中的一个。当计时器为10时,机器人点击获胜的机会非常小。当计时器接近0时,机器人点击“获胜”按钮的机会增加。当然,机器人可能永远不会点击获胜按钮。

我最终想要的是机器人大约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%)。

谁能告诉我我做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分: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% - 这可能是你程序中其他地方的错误吗?)

使用以下数字,您应该观察到整体成功率达到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