如何使概率随着时间的推移而增加,并具有可预测的结果

本文关键字:结果 增加 概率 何使 时间 | 更新日期: 2023-09-27 18:36:04

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

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

最后,我要寻找的是机器人点击"获胜"的时间约为 90%,这些获胜点击的权重更接近计时器为 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%)。

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

如何使概率随着时间的推移而增加,并具有可预测的结果

概率计算比你想象的要复杂。获胜的概率是

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

我们称概率为 p(0) ...第(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