【Puzzle】仓促的决斗

  |  

摘要: 《概率50题》仓促的决斗

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


这是概率面试题连载第 26 期,我们继续看 《Fifty challenging problems in probability with solutions》 中的一道题。

往期的内容整理在这篇文章里;或者看这个 github 仓库

本题是关于几何概型的,在【Puzzle】圆周上随机取3个点形成锐角三角形中我们解决过几何概型的问题,可以跟本题对比一下。我们来看一下这个题。


问题

The-Hurried-Duelers

Duels in the town of Discretion are rarely fatal
There, each contestant comes at a random moment between 5am and 6am on the appointed day, and leaves exactly 5 minutes later, honor served, unless his opponent arrives within the time interval and then they fight
What fraction of duels lead to violence?

在某一天的决斗场,有两个人会在 5 点到 6 点之间随机的某一分钟到来,然后 5 分钟后离开。
如果某一时刻这两个人同时在场,会发生决斗。
问:这两个人发生决斗的概率是多少。


思路参考

记两个人分别为 a 和 b,如图所示,横轴 x 是 a 到达的时间,纵轴 y 是 b 到达的时间,到达的时间范围均为 0 ~ 1。

(x, y) 会随机地在图中的正方形区域中产生,如果两个人的时间间隔小于 1/12 则会发生决斗,也就是 abs(x - y) < 1/12,这对应于图中的阴影部分。

(x, y) 落在阴影的概率是阴影面积与正方形面积的比值。


蒙特卡洛模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
from multiprocessing import Pool

def test(T):
array_arrival_times = 60 * np.random.random(size=(T, 2))
array_diff = np.abs(np.diff(array_arrival_times))
return np.mean(array_diff <= 5)

T = int(1e7)
args = [T] * 8
pool = Pool(8)
ts = pool.map(test, args)
print("发生决斗的概率: {:.6f}".format(sum(ts) / len(ts)))

模拟结果

1
发生决斗的概率: 0.159805

Share