如果我有一个葫芦原本可以饮用 X 次,每次饮用葫芦有概率 p 不消耗次数,葫芦可以饮用次数的期望是多少?

Archimon,应羞怕见

省流:

喝一口相当于喝了

口,那葫芦的饮用期望即为

直接计算的话,可以得到数学期望为:

在针对满级的『上清宝葫芦』一万次模拟中,有三只『天命吗喽』一葫芦喝了 20 口酒,相当于额外背了个葫芦;另外有 2012 只普通猴子只喝到了原本的 10 口酒,可谓是泡了等于白泡


饮用期望

饮用期望的计算有两种方式,一种是便于计算的反向考虑,一种是便于考虑的直接计算:

反向考虑

的概率不消耗葫芦的使用次数,那就是有

的概率会消耗葫芦的使用次数,也是每喝一口消耗的使用次数期望为『

』,那葫芦的饮用期望即为

直接计算

直接计算饮用次数的期望的话,我们首先要计算第

次喝完的概率

。为了叙述方便,这里我们称不消耗次数的饮酒为『奖励事件』,发生概率为

;消耗次数的情况为普通事件,发生概率为

;为了推导过程的美观,葫芦总容量用字母

表示

『第

次喝完』意味着事件

『第

次事件为普通事件』和事件

『前

次发生了

次奖励事件』同时发生。事件

的发生概率为

,事件

的发生概率可以表示为

由于事件

相互独立,则:

那么,饮用次数的期望即为:

我们可以看到,在上式中绿色的部分实际上是一个与

无关的常量,所以我们将其提出求和进行简化。现在我们考虑求和内部的内容,做以下代换。

观察上式右侧结果,实际上相当于是

求了

次导,所以我们可以进一步得到:

从而期望为:


模拟验证

我们也可以做一个简单的模拟进行验证。以『上清宝葫芦』为例,升到满级后总共可以喝 10 口,蜂山石髓有 15%的概率不消耗使用次数,那么按照上式计算出的使用期望约为11.76.

他就把那葫芦都倾出来,就都吃了,如吃炒豆相似

我们可以用以下方式进行 10000 次模拟:

from random import randint

def hulu_whole():
    left_drinks = 10
    drink_times = 0
    while left_drinks > 0:
        drink_times += 1
        if randint(1,100) < 86:
            left_drinks -= 1
        else:
            # 触发蜂山石髓,不消耗次数
            pass
    return drink_times

test_10000 = []
for i in range(10000):
    test_10000.append(hulu_whole())

如代码所示,每次模拟都到喝光葫芦停止,记录最终喝的次数。

最终结果如上图所示:在这一万次的模拟中,有三只『天命吗喽』一葫芦喝了 20 口酒,相当于额外背了个葫芦;另外有 2012 只普通猴子只喝到了原本的 10 口酒,可谓是泡了等于白泡

平均下来,每个葫芦提供了 11.759 口酒,和我们计算的结果相吻合。


大家如果对于游戏中的数学感兴趣的话,还可以看看这个回答:

《博德之门 3》中,优势骰有多优势,劣势骰又有多劣势?