问题描述:
将 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/
请尊重作者的劳动成果,转载请注明出处!书影博客保留对文章的所有权利。