Python 两种随机点生成方法的差异

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)

为了进行蒙特卡罗模拟以估计$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)])

      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中得到了修复,非常好。