两种随机点生成方法的区别

Difference between two methods of random point generation

为了进行 monte carlo 模拟以估计 $n$ 维度中两个随机点之间的预期距离 space 我发现以下两种看起来相似的生成随机点的方法似乎有所不同。我不知道为什么。

方法一:

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

方法二:

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.uniformnp代表numpy。

两种方法运行 100 次(对于 n = 2),使用方法 1,我得到 $\mu = 0.53810011995126483, \sigma = 0.13064091613389378$ 使用方法 2,$\mu = 0.52155615672453093,\sigma = 0.0023768774304696902$

为什么两种方法的std dev差异这么大?

这里是尝试的代码: https://gist.github.com/swairshah/227f056e6acee07db6778c3ae746685b (我已经用 numpy 替换了 scipy,因为它更快但它与 std dev 有相同的区别)

在 Python 2 中,列表理解泄漏了它们的循环变量。

由于您在列表推导 ([u.rvs() for i in range(n)]) 中循环 i,这就是 dist = (dist*i + euclidean_dist(x,y))/(i+1.0) 中使用的 i。 (i 总是等于 n-1 而不是主循环变量的值。)