在闭区间[0, 1]内,我们随机取出两点(服从均匀分布)A和B,形成一个新的闭区间[min{A,B}, max{A,B}]。如此反复n次,我们就有了n个随机闭区间。那么这n个闭区间不出现重叠的概率是多大呢?
2个回答
答案是
$$\frac{2^n n!}{(2n)!}.$$
思路大致如下:
我们是随机按照均匀分布抽取$n$个闭区间的上下界。我们把$n$个区间的下界从小到大排序,也就是$(x_{1,1},x_{1,2}),(x_{2,1},x_{2,2}),\cdots,(x_{n,1},x_{n,2})$,满足$x_{1,1}<x_{2,1}<x_{3,1}<\cdots < x_{n,1}$。
在这种情况下,唯一能够达到所有闭区间不重叠的情况是
$$x_{1,1} < x_{1,2} < x_{2,1} < x_{2,2} < x_{3,1} < x_{3,2} < \cdots < x_{n,1} < x_{n,2}.$$
因为我们只在乎其排序,而且均匀随机抽样。这个问题就等价于从集合$\{1,2,3,\cdots,2n\}$中无放回的抽样。
符合不重叠的唯一可能性是
$$x_{1,1}=1,x_{1,2}=2,x_{2,1}=3,\cdots,x_{n,1}=2n-1,x_{n,2}=2n,$$
而所有的可能性一共有
$$\frac{(2n)!}{2^n n!}.$$
然后就可以得到概率。
所有的可能性一共有,这个公式的每一项有人帮忙解释下吗?
-
Neil
2020-08-13 09:44
我用python验证了下高代兄的答案
import math
import pandas as pd
import numpy as np
n = 3
rounds = 10000
p = 0
for m in range(rounds):
bounds = pd.DataFrame(columns=['lower_bound', 'upper_bound'])
for i in range(n):
bounds.loc[i] = np.sort(np.random.uniform(0, 1, 2))
bounds.sort_values('lower_bound', inplace=True)
diff = np.diff(bounds['upper_bound'].values)
p += np.all(diff <= 0) / float(rounds)
print('simulation', p)
print('true:', ((2 ** n) * math.factorial(n)) / math.factorial(2*n))
得到的结果:
simulation: 0.0675
true: 0.06666666666666667
SofaSofa数据科学社区DS面试题库 DS面经