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

时间:2016-07-09 05:06:37

标签: 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)])

      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.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之间有相同的差异)

1 个答案:

答案 0 :(得分:2)

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

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