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 極坐標系。
添加回答
舉報