Dam ci ogólną n-wymiarową odpowiedź, która oczywiście działa również w przypadku dwuwymiarowej. W trzech wymiarach analog dysku jest objętością litej kuli (kuli).
Omówię dwa podejścia. Jeden z nich nazwałbym „precyzyjnym” , a dostaniesz z nim kompletne rozwiązanie w R. Drugi, który nazywam heurystyczny , i to tylko pomysł, nie ma pełnego rozwiązania.
„Precyzyjne” rozwiązanie
Moje rozwiązanie oparte jest na pracach Marsaglii i Mullera . Zasadniczo dzieje się tak, że wektor Gaussa znormalizowany do swojej normy dałby równomiernie rozmieszczone punkty na hipersferze d-wymiarowej:
re1 / d
n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")
Oto fragment kodu dla przypadku 3D, czyli litej kuli:
library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk
d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
scatterplot3d(x[,1], x[,2], x[,3])
Podejście heurystyczne
V.n( R ) = πn2)Γ ( n2)+ 1 )Rn
Rn
Dlaczego ma to znaczenie dla naszego problemu? Załóżmy, że chcesz wygenerować d losowe liczby jednolite, byłyby to losowe punkty wewnątrz hipersześcianu d-wymiarowego. Następnie stosuje się próbkowanie odrzucenia, aby wybrać punkty wewnątrz hipersfery (aka n-ball): ∑rei = 1x2)ja< R2)
1re+ 2√