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 CircStatse circular. Provavelmente existe algo no CRAN que gera distribuições uniformes nas n-esferas para n> 1, mas eu não sei.