倒水概率问题

问题描述:

将 1L 水依次倒入 3 个杯子(倒完前 2 杯后,剩余水全部放入第 3 杯),求任意 1 杯水大于 0.5L 的概率。

假设杯子容量大于 1L ,倒出水的体积服从[0, V]上的均匀分布, V 为剩余水的体积。

解题思路:

任意 1 杯水大于 0.5L,可以分解为下面三种情况:

P1. 倒出第一杯水超过 0.5L 的概率为 0.5

P2. 倒出第二杯水超过 0.5L 的概率:

  设倒出第一杯水的体积为 x ( x < 0.5 ),则有:P2 = ∫( 1 - x - 0.5) / (1 - x)   x ∈ [0, 0.5]

P3. 倒出第三杯水超过 0.5L 的概率:

  等价于求倒出前两杯水的和小于 0.5L 的概率

  设倒出第一杯水的体积为 x ( x < 0.5 ),则有:P3 = ∫( 0.5 - x) / (1 - x)    x ∈ [0, 0.5]

P1 + P2 + P3 = 0.5 + ∫ (2 * x - 1) / (x - 1)    x ∈ [0, 0.5]

上式中 ∫ (2 * x - 1) / (x - 1) 的原函数为: 2x + ln |x - 1| + C

最终答案为P = 1.5 + ln(0.5) ≈ 0.807

下面用Monte Carlo方法验证答案。

Python代码:

import random

class PourWater(object):
    def montecarlo(self, num):
        cnt = 0
        for x in range(num):
            p1 = random.uniform(0, 1)
            p2 = random.uniform(0, 1 - p1)
            if max(p1, p2, 1 - p1 - p2) > 0.5:
                cnt += 1
        return 1.0 * cnt / num

print PourWater().montecarlo(100000)

 

本文链接:http://bookshadow.com/weblog/2016/11/12/water-pouring-probability/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。

如果您喜欢这篇博文,欢迎您捐赠书影博客: ,查看支付宝二维码