1

我有一个机器人玩的游戏程序。为简单起见,游戏有 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%)。

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

4

1 回答 1

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
于 2013-10-18T07:42:39.377 回答