Dans le cas d'un cercle, il suffit de générer un angle uniforme, θ, sur [0,2π) puis faites le rayon, r, tout ce qui est souhaité. Si vous voulez des coordonnées cartésiennes plutôt que polaires,x=rcosθ et y=rsinθ.
Un moyen vraiment simple de générer des points aléatoires à partir d'une distribution uniforme d'une sphère d (une hypersphère dans un espace de dimension arbitraire d+1, avec surface de dimension d), consiste à générer des normales standard multivariées Xi∼Nd+1(0,I), puis l'échelle en fonction de leur distance par rapport à l'origine:
Yi=Xi/||Xi||,
où ||.||est la norme euclidienne .
En R, générons à la surface d'une (2-) sphère:
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
Voici ces données sous deux angles légèrement différents:
Vous pouvez ensuite vous adapter à n'importe quel autre rayon que vous souhaitez.
Dans les petites dimensions, il existe des moyens plus rapides, mais si votre générateur de nombres aléatoires normal est raisonnablement rapide, il est assez bon dans les dimensions supérieures.
Il existe plusieurs packages sur CRAN pour les statistiques circulaires, y compris CircStats
et circular
. Il y a probablement quelque chose sur CRAN qui génère des distributions uniformes sur n-sphères pour n> 1, mais je ne le sais pas.