【Puzzle】较短的一节木棍

  |  

摘要: 《概率50题》向正方形投掷硬币

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


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

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

本题是关于连续型随机变量的,涉及到连续型随机变量的期望,连续型随机变量的函数的概率密度函数。我们来看一下这个题。


问题

The Little End of the Stick

a. If a stick is broken in two at a random spot, what is the average length of the smaller piece?

b. What is the average ratio of the smaller length to the larger?

一根棍子,随机选个分割点,将棍子分为两根
a. 较小的那一根的长度平均是多少
b. 较小的那一根与较长的那一根的比例,平均是多少


思路参考

假设木棍长度为 1,分隔点 x 是 (0, 1) 上的均匀分布,也就是 x ~ U(0, 1),概率密度函数 fx(x) = 1, 0 < x < 1。

记较短的那一根的长度为 y,y 与 x 的关系如下

下面我们分别看 (a) 和 (b) 两问

(a)

要求 y 的期望,我们还需要两个知识点,一个是连续型随机变量的期望,一个是连续型随机变量函数的概率密度函数。

知识点复习

(1) 连续型随机变量的期望

(2) 随机变量函数的概率密度函数

X 的概率密度函数为 fx(x),Y = g(X),Y 的概率密度函数是多少。这个问题比较复杂,下面介绍一下通用的流程

  • step1: 首先由 X 的范围 Rx 求出 Y 的范围 Ry

  • step2: 然后对 Y 的范围中的每一个 y,求出分布函数 Fy(y)

其中 $x\in Ry$ 与 $g(X) \leq y$ 是相同的随机事件。$Ry = \{x: g(x) \leq y\}$。

  • step3: 对分布函数 Fy(y) 求导得到密度函数 fy(y)。

而如果 g(X) 是严格单调函数,x = h(y) 为相应的反函数,且可导,则 Y = g(X) 的密度函数可以直接给出

计算

有了以上两个知识点,我们就可以开始计算了,下面我们推导 y 的概率密度函数。

g 是一个分段函数,在 (0, 1/2) 上,y = x,单调递增,在 (1/2, 1) 上,y = x,单调递减。因此我们可以对这两个范围分别来看。

(1) 对于 0 < x < 1/2

在 0 < x < 1/2 范围内, y = g(x) = x,因此 0 < y < 1/2,其反函数 x = h(y) = y,导数 h’(y) = 1。y 的密度函数如下

y 的期望如下

(2) 对于 1/2 < x < 1

在 1/2 < x < 1 范围内,y = g(x) = 1 - x,因此 0 < y < 1/2,其反函数 x = h(y) = 1 - y,导数 h’(y) = -1。y 的密度函数如下

y 的期望如下

将两部分加到一起即可得到所求的期望值,答案为 1/4

(b)

要求较小的那一根与较长的那一根的比例的期望,也就是求 y / (1 - y) 的期望。

由 (a),我们已经知道

定义随机变量 Z = Y / (1 - Y)

g(y) 是严格单调的,其反函数为 h(z) = z / (z + 1),其导数为 $h’(z) = (z + 1)^{-2}$, z 的范围为 (0, 1),因此 z 的密度函数如下

Z 的期望如下

蒙特卡洛模拟

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import numpy as np

def pyfunc(x):
"""
0 < x < 1
"""
if x > 0.5:
x = 1 - x
return x

def pyfunc2(x):
"""
0 < x < 0.5
"""
return x / (1 - x)

func = np.frompyfunc(pyfunc, 1, 1)
func2 = np.frompyfunc(pyfunc2, 1, 1)

def test(T):
X = np.random.uniform(0, 1, T)
X = func(X)
Y = func2(X)
return (np.mean(X), np.mean(Y))

T = int(1e7)
m1, m2 = test(T)
print("较短的木棍的期望长度: {:.6f}".format(m1))
print("较短的木棍与较长的木根长度比值的期望: {:.6f}".format(m2))

模拟结果

1
2
较短的木棍的期望长度: 0.249920
较短的木棍与较长的木根长度比值的期望: 0.386187

Share