J'essayais de simuler l'injection de points aléatoires dans un cercle, de sorte que n'importe quelle partie du cercle ait la même probabilité d'avoir un défaut. Je m'attendais à ce que le compte par zone de la distribution résultante suive une distribution de Poisson si je divise le cercle en rectangles de zone égale.
Puisqu'il ne nécessite que de placer des points dans une zone circulaire, j'ai injecté deux distributions aléatoires uniformes en coordonnées polaires: (rayon) et (angle polaire).
Mais après avoir fait cette injection, j'obtiens clairement plus de points au centre du cercle par rapport au bord.
Quelle serait la bonne façon d'effectuer cette injection à travers le cercle de telle sorte que les points soient répartis de manière aléatoire à travers le cercle?
Réponses:
Vous souhaitez que la proportion de points soit uniformément proportionnelle à l' aire plutôt qu'à la distance à l'origine. Puisque l'aire est proportionnelle à la distance au carré, générez des rayons aléatoires uniformes et prenez leurs racines carrées. Combinez cela avec un angle polaire uniforme.
C'est rapide et simple à coder, efficace en exécution (en particulier sur une plateforme parallèle), et génère exactement le nombre de points prescrit.
Exemple
Il s'agit d'un
R
code de travail pour illustrer l'algorithme.la source
L'échantillonnage de rejet peut être utilisé. Cela signifie que nous pouvons échantillonner à partir d'une distribution uniforme 2D et sélectionner des échantillons qui satisfont la condition du disque.
Voici un exemple.
la source
Je vais vous donner une réponse générale à n dimensions qui fonctionne également pour les cas à deux dimensions. En trois dimensions, l'analogue d'un disque est le volume d'une boule solide (sphère).
Il y a deux approches dont je vais discuter. L'un d'eux, je l'appellerais «précis» , et vous obtiendrez une solution complète avec lui dans R. Le second que j'appelle heuristique , et ce n'est que l'idée, aucune solution complète n'est fournie.
Solution "précise"
Ma solution est basée sur les travaux de Marsaglia et Muller . Fondamentalement, cela se produit de sorte que le vecteur gaussien normalisé à sa norme vous donne les points uniformément distribués sur une hypersphère d-dimensionnelle:
Voici un extrait de code pour le cas 3D, c'est-à-dire une boule solide:
Approche heuristique
la source
Voici une solution alternative en
R
:la source
r <- seq(0, 1, by=1/10)
r
partir d'uniforme (0,1).