No caso de um círculo, basta gerar um ângulo uniforme, , em e depois fazer o raio, , o que for desejado. Se você deseja coordenadas cartesianas, em vez de polares, e .[ 0 , 2 π ) r x = r cos θ y = r sen θθ[ 0 , 2 π)rx = r cosθy= r sinθ
Uma maneira realmente fácil de gerar pontos aleatórios a partir de uma distribuição uniforme de uma esfera d (uma hiperesfera em um espaço de dimensão arbitrária , com superfície de dimensão ), é gerar normais padrão multivariados e, em seguida, escala pela distância da origem:d X i ∼ N d + 1 ( 0 , I )d+ 1dXEu∼ Nd+ 1( 0 , eu)
YEu= XEu/ | | XEu| |,
ondeé a norma euclidiana .| | . | |
Em R, vamos gerar na superfície de uma (2) esfera:
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
Aqui estão os dados de dois ângulos ligeiramente diferentes:
Você pode então escalar para qualquer outro raio que desejar.
Em dimensões baixas, existem maneiras mais rápidas, mas se o gerador normal de números aleatórios for razoavelmente rápido, será muito bom em dimensões mais altas.
Existem vários pacotes no CRAN para estatísticas circulares, incluindo CircStats
e circular
. Provavelmente existe algo no CRAN que gera distribuições uniformes nas n-esferas para n> 1, mas eu não sei.