En el caso de un círculo, es suficiente generar un ángulo uniforme, θ, en [ 0 , 2 π) y luego hacer el radio, r, lo que se desee. Si quieres cartesiano, en lugar de coordenadas polares,x=rcosθ y y=rsinθ.
Una forma realmente fácil de generar puntos aleatorios a partir de una distribución uniforme, una esfera d (una hiperesfera en un espacio de dimensión arbitraria d+1, con superficie de dimensión d), es generar normales estándar multivariantes Xi∼Nd+1(0,I), y luego escalar por su distancia desde el origen:
Yi=Xi/||Xi||,
dónde ||.||es la norma euclidiana .
En R, generemos en la superficie de una esfera (2-):
x <- matrix(rnorm(300),nc=3)
y <- x/sqrt(rowSums(x^2))
head(y)
[,1] [,2] [,3]
[1,] 0.9989826 -0.03752732 0.02500752
[2,] -0.1740810 0.08668104 0.98090887
[3,] -0.7121632 -0.70011994 0.05153283
[4,] -0.5843537 -0.49940138 0.63963192
[5,] -0.7059208 0.20506946 0.67795451
[6,] -0.6244425 -0.70917197 0.32733262
head(rowSums(y^2))
[1] 1 1 1 1 1 1
Aquí están esos datos desde dos ángulos ligeramente diferentes:
Luego puede escalar a cualquier otro radio que desee.
En dimensiones bajas, hay formas más rápidas, pero si su generador normal de números aleatorios es razonablemente rápido, es bastante bueno en dimensiones más altas.
Hay varios paquetes en CRAN para estadísticas circulares, incluidos CircStats
y circular
. Probablemente haya algo en CRAN que genere distribuciones uniformes en n-esferas para n> 1, pero no lo sé.