编辑:添加了一些代码来改进这个数字。
您的代码很好,结果确实与分析得出的值一致。为了更容易看到这一点,我稍微修改了您的代码,将 X 和 Y 的域缩小到 [0, 1] 并计算 P(|Z| < 7/200),因此这仍然等同于您的原始问题.
from scipy.stats import uniform
import matplotlib.pyplot as plt
a, b = 0, 1
size = 1000000
# generate uniformly distributed x and y
uniform_distribution = uniform(loc=a, scale=b)
x = uniform_distribution.rvs(size=size)
y = uniform_distribution.rvs(size=size)
z = x - y
# set up figure
fig, ax = plt.subplots(figsize = [16, 8])
ax.set_aspect('equal')
ax.set_xlim([-1, 1])
ax.set_ylim([0, 1])
ax.set_xticks([-1, 0, 1])
ax.set_xticklabels([-1, 0, 1], size=20)
ax.set_yticks([0, 1])
ax.set_yticklabels([0, 1], size=20)
# plot histogram with y-axis scaled to show density,
# increased bin number for better resolution
ax.hist(z, density=True, bins=200, alpha=0.5)
# plot lines around the area we want to estimate
plt.axvline(-7/200, color='black', linestyle='--')
ax.annotate('x = -7/200', xy=(-7/200, 0.4), xytext=(-0.05, 0.4), fontsize=16, ha='right')
plt.axvline( 7/200, color='black', linestyle='--')
ax.annotate('x = 7/200', xy=(7/200, 0.2), xytext=(0.05, 0.2), fontsize=16)
# plot theoretical probability density function
ax.plot([-1, 0], [0, 1], color='gray', linestyle=':')
ax.plot([ 0, 1], [1, 0], color='gray', linestyle=':')
zsmall = [1 for i in z if abs(i) < 7/200]
n = len(zsmall)
print("probability =", n/size)
概率 = 0.06857
如您所见,这已经非常接近理论上预期的三角形分布(灰色虚线)。为了比较,我们可以计算理论概率,即虚线之间和虚线以下的区域。我们可以将其计算为虚线之间的整个矩形的面积减去由虚线上方的两个小三角形组成的正方形的面积:
2*(7/200) - (7/200)**2
= 0.068775
所以理论值确实与你的模拟结果一致。