2 回答
TA贡献1803条经验 获得超3个赞
两个点的初始随机值包含在立方体中,而不是球体中。在按 1/length 缩放每个矢量后,矢量位于单位球体上,但它们在球体表面上分布不均匀。
与每个面的中心相比,您往往会在立方体的角附近获得更多矢量。由于向量倾向于聚集在区域中,因此它们之间的距离平均值小于 4/3。
这将达到目的: https ://mathworld.wolfram.com/SpherePointPicking.html
此代码对我有用:
from math import sqrt
from random import uniform
sum2 = 0
size = 0
while size < 100000:
x1 = uniform(-1, 1)
y1 = uniform(-1, 1)
x2 = uniform(-1, 1)
y2 = uniform(-1, 1)
z1 = uniform(-1, 1)
z2 = uniform(-1, 1)
r1 = sqrt(x1**2 + y1**2 + z1**2)
r2 = sqrt(x2**2 + y2**2 + z2**2)
if r1 > 1 or r2 > 1 or x1==y1==z1==0 or x2==y2==z2==0: continue
size += 1
x1 /= r1
y1 /= r1
z1 /= r1
x2 /= r2
y2 /= r2
z2 /= r2
sum2 += sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 + (z1 - z2) ** 2)
print(sum2/size)
输出是:
1.3337880809331075
TA贡献1836条经验 获得超4个赞
正如所解释的那样,这个小型 MC 模拟的随机抽样没有以正确的方式进行。
您想要提取均匀分布在球体表面的随机点。最简单的方法是使用极坐标并随机选择角度 theta(0-pi)和 phi(0-2pi)。
如果你想保持笛卡尔坐标,你必须使用已知的变换矩阵将你的分布从笛卡尔坐标系转换为 3-d 极坐标系。
添加回答
举报