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

标签 python simulation uniform

为了进行蒙特卡罗模拟来估计 $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.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 中,列表推导式会泄漏其循环变量。

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

关于python - 两种随机点生成方法的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38310737/

相关文章:

c++ - 802154a 的 Omnet++ 和 INET

多维空间中的随机单位向量

c++ - 无法将统一 float 组传递给片段着色器

python - 频率计数器在我更改之前正在排序列表,更改后应该何时排序

python - 如何检查是否执行了 Python 中的 RE

python - 如何在整个数据框中的每一列中找到最后一个非零元素?

arrays - WebGL:将统一数组传递给着色器

python - 何时在进程上调用 .join()?

javascript - 与客户模拟使用网站

r - R中多个二项式随机数的模拟