【发布时间】:2013-10-26 21:57:42
【问题描述】:
我有一个由机器人玩的游戏程序。为简单起见,游戏有 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%)。
谁能告诉我我做错了什么?提前致谢。
【问题讨论】:
-
我删除了我的评论,因为它不准确但想法是正确的。搞砸你的逻辑的是
probabilityOfClickingWin和它的计算方式。要获得所需的概率,它需要是probability * maxRandomNumberThatCanBeReturned。由于Random.NextDouble返回最大值1.0d,您需要通过0.9d才能获得90% 的返回true。这是示例:ideone.com/a8wxw6 更高的尝试更准确成为结果。同时保持Random对象静态(reason) -
Leri - 看起来您的示例中的 CompareWithRandom() 将在“尝试”的每次迭代中返回 true 约 90% 的时间。这实际上不是我需要的。我需要它,以便对于组合的所有“尝试”迭代,CompareWithRandom() 仅返回一次 true 的可能性约为 90%。不过,感谢您抽出宝贵时间。
标签: c# statistics probability