均匀分布变量之间的差异,Python

Difference between uniformly distributed variables, Python

我是 Python 的新手,我曾尝试将此问题作为学习练习,但我无所适从。

我想要做的是证明对于在 200ns window 内均匀分布的两个随机变量,它们在 7ns 内到达彼此的概率是 ~5%:

X, Y ~ U[0, 200]

Z = X - Y

P(|Z| < 7) = ?

我想知道执行此操作的最具分析性的方法,因为我认为 Python 可能有一些有用的库可以提供帮助,并且因为如果我想进行随机模拟,我会在 C++ ROOT 中进行这会花费我更少的时间!

下面是我的计算方法,但与我分析计算的方法不同。谁能提出 better/more 解决同一问题的准确方法?

非常感谢!

from scipy.stats import uniform, expon
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(1, 1)

a, b = 0, 200
size = 1000000

# Genrating uniform distribution
uniform_distribution = uniform(loc=a, scale=b)
x = uniform_distribution.rvs(size=size)
y = uniform_distribution.rvs(size=size)

z=x-y

ax.hist(z)

zsmall=[z for i in z if abs(i)<7]

n=len(zsmall)

print("probability = ",n/size)

编辑:添加了一些代码来改进图形。


您的代码很好,结果与分析得出的值一致。为了更容易地看到这一点,我稍微修改了你的代码,将 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

所以理论值和你的模拟结果是一致的