Существует простой Мюллер и Марсалья подход для генерации равномерного распределения на поверхности гиперсферы.
Создание n переменных с гауссовым распределением (список l
здесь).Они образуют некоторый вектор.
Найдите длину этого вектора и нормализуйте его компоненты, чтобы получить результат длины единицы
Пример показывает генерацию одной точки на сфере в пространстве 10d, а также визуально проверяет однородность для пакетауказывает на круг (сфера в 2d, значения гистограммы должны быть близки)
import random, math
#muller-marsaglia method
def spherepicking(n):
while True: #to get rid off [0,0,0,0] case
l = [random.gauss(0, 1) for i in range(n)]
sumsq = sum([x * x for x in l])
if sumsq > 0:
break
norm = 1.0 / math.sqrt(sumsq)
pt = [x * norm for x in l]
return pt
print(spherepicking(10))
cnt = [0] * 18
for i in range(10000):
pt = spherepicking(2)
an = math.atan2(pt[1], pt[0]) + math.pi / 2
cnt[math.floor(an * 9 / math.pi)] += 1
print(cnt)
-0.31811419572739935, 0.2845442135156396, -0.2849019746359018,
-0.1326796017012003, 0.7388447238721524, -0.287062305232526,
-0.08794741714783766, 0.131707880836534, 0.22059937624019868,
-0.13047162618106062]
[554, 560, 529, 589, 534, 538, 550, 558, 578, 556, 522, 553, 561, 513, 592, 583, 593, 537]