Python 两种随机点生成方法的差异
为了进行蒙特卡罗模拟以估计$n$维空间中两个随机点之间的预期距离,我发现以下两种生成随机点的相似方法似乎有所不同。我不知道为什么 方法1:Python 两种随机点生成方法的差异,python,simulation,uniform,Python,Simulation,Uniform,为了进行蒙特卡罗模拟以估计$n$维空间中两个随机点之间的预期距离,我发现以下两种生成随机点的相似方法似乎有所不同。我不知道为什么 方法1: def expec_distance1(n, N = 10000): u = uniform(0,1) dist = 0 for i in range(N): x = np.array([u.rvs() for i in range(n)]) y = np.array([u.rvs() for i in range(n)
def expec_distance1(n, N = 10000):
u = uniform(0,1)
dist = 0
for i in range(N):
x = np.array([u.rvs() for i in range(n)])
y = np.array([u.rvs() for i in range(n)])
dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
return dist
方法2:
def expec_distance2(n, N = 10000):
u = uniform(0,1)
dist = 0
for i in range(N):
x = u.rvs(n)
y = u.rvs(n)
dist = (dist*i + euclidean_dist(x,y))/(i+1.0)
return dist
其中,均匀分布是scipy.stats.uniform
和np
代表numpy
对于两种方法的100次运行(对于n=2),使用方法1,我得到$\mu=0.53810011995126483,\sigma=0.13064091613389378$
对于方法2,$\mu=0.52155615672453093,\sigma=0.002376874304696902$
为什么两种方法之间有这么大的差异
以下是要尝试的代码:
(我已经用numpy替换了scipy,因为它速度更快,但与std-dev有相同的区别)在Python 2中,列表理解泄漏了它们的循环变量
由于您在列表理解中循环使用
i
([u.rvs()表示范围内的i(n)]
),这就是dist=(dist*i+euclidean\u dist(x,y))/(i+1.0)中使用的i
。(i
始终等于n-1
而不是主循环变量的值。)相关注释来自此处的第一个答案:。“但是它们不同的原因是没有提供你能发布一个完整的、可运行的吗?”米凯格拉汉姆补充到帖子中。布莱奇,我想起来晚了12分钟。愚蠢的Python作用域。这在Python3中得到了修复,非常好。