Im Fall eines Kreises reicht es aus, einen gleichmäßigen Winkel auf zu erzeugen und dann den Radius bestimmen, was auch immer gewünscht wird. Wenn Sie kartesische statt polare Koordinaten möchten, ist und .θ[ 0 , 2 π)rx = r cosθy= r sinθ
Eine wirklich einfache Möglichkeit, zufällige Punkte aus einer gleichmäßigen Verteilung einer d-Kugel (einer Hypersphäre in einem Raum beliebiger Dimension mit Oberfläche der Dimension ) zu erzeugen, besteht darin, multivariate Standardnormalen zu erzeugen und skalieren Sie dann nach ihrem Abstand vom Ursprung:d+ 1dX.ich∼ N.d+ 1( 0 , ich)
Y.ich= X.ich/ | | X.ich| |,
woist die euklidische Norm .| | . | |
In R erzeugen wir auf der Oberfläche einer (2-) Kugel:
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
Hier sind diese Daten aus zwei leicht unterschiedlichen Blickwinkeln:
Sie können dann auf einen beliebigen anderen Radius skalieren.
In niedrigen Dimensionen gibt es schnellere Möglichkeiten, aber wenn Ihr normaler Zufallszahlengenerator relativ schnell ist, ist er in höheren Dimensionen ziemlich gut.
Auf CRAN gibt es mehrere Pakete für zirkuläre Statistiken, einschließlich CircStats
und circular
. Es gibt wahrscheinlich etwas auf CRAN, das gleichmäßige Verteilungen auf n-Kugeln für n> 1 erzeugt, aber ich weiß es nicht.