Редактировать: добавлен некоторый код для улучшения рисунка.
Ваш код в порядке, и результаты соответствуют аналитически полученному значению. Чтобы увидеть это с большей готовностью, я немного изменил ваш код, уменьшив домены X и Y до [0, 1] и вычислив P (| Z | <7/200), так что это все равно эквивалентно вашему первоначальному вопросу. , </p>
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
Как видите, это приближается к теоретически ожидаемому три Распределение angular (серые пунктирные линии) уже довольно близко. Для сравнения мы можем рассчитать теоретическую вероятность, которая представляет собой площадь между пунктирными линиями и ниже пунктирных линий. Мы можем вычислить это как площадь всего прямоугольника между пунктирными линиями минус площадь квадрата, состоящего из двух маленьких треугольников над пунктирными линиями:
2*(7/200) - (7/200)**2
= 0.068775
Таким образом, теоретическое значение соответствует вашему результату моделирования.