Necesito generar un punto uniformemente aleatorio dentro de un círculo de radio R .
Me doy cuenta de que simplemente seleccionando un ángulo uniformemente aleatorio en el intervalo [0 ... 2π) y un radio uniformemente aleatorio en el intervalo (0 ... R ) terminaría con más puntos hacia el centro, ya que para dos dados radios, los puntos en el radio más pequeño estarán más cerca uno del otro que para los puntos en el radio más grande.
Encontré una entrada de blog sobre esto aquí, pero no entiendo su razonamiento. Supongo que es correcto, pero realmente me gustaría entender de dónde obtiene (2 / R 2 ) × r y cómo deriva la solución final.
Actualización: 7 años después de publicar esta pregunta, todavía no había recibido una respuesta satisfactoria sobre la pregunta real sobre las matemáticas detrás del algoritmo de raíz cuadrada. Así que me pasé un día escribiendo una respuesta yo mismo. Enlace a mi respuesta .
fuente
Respuestas:
Abordemos esto como lo haría Arquímedes.
¿Cómo podemos generar un punto uniformemente en un triángulo ABC, donde | AB | = | BC |? Hagamos esto más fácil extendiéndonos a un paralelogramo ABCD. Es fácil generar puntos de manera uniforme en ABCD. Elegimos uniformemente un punto aleatorio X en AB e Y en BC y elegimos Z de modo que XBYZ sea un paralelogramo. Para obtener un punto elegido uniformemente en el triángulo original, simplemente doblamos los puntos que aparecen en ADC hacia ABC a lo largo de AC.
Ahora considere un círculo. En el límite podemos pensar en él como infinitos triángulos isoceles ABC con B en el origen y A y C en la circunferencia que se desvanecen uno cerca del otro. Podemos elegir uno de estos triángulos simplemente eligiendo un ángulo theta. Entonces ahora necesitamos generar una distancia desde el centro seleccionando un punto en la astilla ABC. Nuevamente, extienda a ABCD, donde D ahora es dos veces el radio desde el centro del círculo.
Elegir un punto aleatorio en ABCD es fácil usando el método anterior. Elija un punto aleatorio en AB. Elija uniformemente un punto aleatorio en BC. Es decir. escoja un par de números aleatorios x e y uniformemente en [0, R] dando distancias desde el centro. Nuestro triángulo es una astilla delgada, por lo que AB y BC son esencialmente paralelos. Entonces, el punto Z es simplemente una distancia x + y desde el origen. Si x + y> R volvemos a doblar.
Aquí está el algoritmo completo para R = 1. Espero que estés de acuerdo, es bastante simple. Utiliza trigonometría, pero puede brindar una garantía sobre cuánto tiempo llevará y cuántas
random()
llamadas necesita, a diferencia del muestreo de rechazo.Aquí está en Mathematica.
fuente
random()+random()+random()
con algunos pliegues más complejos (es decir, un pliegue de 6 vías de un paralelepípedo infinitesimalmente delgado a un teraedro). Sin embargo, no estoy convencido de que este sea un buen método.Cómo generar un punto aleatorio dentro de un círculo de radio R :
(Suponiendo que
random()
da un valor entre 0 y 1 de manera uniforme)Si desea convertir esto a coordenadas cartesianas, puede hacer
¿Por qué
sqrt(random())
?Veamos las matemáticas que conducen a
sqrt(random())
. Supongamos por simplicidad que estamos trabajando con el círculo unitario, es decir, R = 1.La distancia promedio entre puntos debe ser la misma independientemente de cuán lejos del centro miremos. Esto significa, por ejemplo, que mirando el perímetro de un círculo con circunferencia 2 deberíamos encontrar el doble de puntos que el número de puntos en el perímetro de un círculo con circunferencia 1.
Como la circunferencia de un círculo (2π r ) crece linealmente con r , se deduce que el número de puntos aleatorios debería crecer linealmente con r . En otras palabras, la función de densidad de probabilidad deseada (PDF) crece linealmente. Como un PDF debe tener un área igual a 1 y el radio máximo es 1, tenemos
Entonces sabemos cómo debería ser la densidad deseada de nuestros valores aleatorios. Ahora: ¿Cómo generamos un valor aleatorio cuando todo lo que tenemos es un valor aleatorio uniforme entre 0 y 1?
Usamos un truco llamado muestreo de transformación inversa
¿Suena complicado? Permítanme insertar una cita en bloque con una pequeña pista lateral que transmite la intuición:
... entonces, volviendo a generar valores de radio aleatorios donde nuestro PDF es igual a 2 x .
Paso 1: Cree el CDF:
dado que estamos trabajando con reales, el CDF se expresa como la integral del PDF.
CDF ( x ) = ∫ 2 x = x 2
Paso 2: Descarga el CDF a lo largo de y = x :
Matemáticamente, esto se reduce a intercambiar x e y resolver por y :
CDF : y = x 2
Intercambio: x = y 2
Resolver: y = √ x
CDF -1 : y = √ x
Paso 3: aplique la función resultante a un valor uniforme entre 0 y 1
CDF -1 (aleatorio ()) = √ aleatorio ()
Que es lo que nos propusimos derivar :-)
fuente
random(min_radius², max_radius²)
, ¿quieres decir algo equivalente arandom() * (max_radius² - min_radius²) + min_radius²
, donderandom()
devuelve un valor uniforme entre 0 y 1?Aquí hay una solución rápida y simple.
Elija dos números aleatorios en el rango (0, 1), a saber,
a
yb
. Sib < a
, intercambiarlos. Su punto es(b*R*cos(2*pi*a/b), b*R*sin(2*pi*a/b))
.Puede pensar en esta solución de la siguiente manera. Si tomas el círculo, lo cortas y lo enderezas, obtendrás un triángulo rectángulo. Escalar ese triángulo hacia abajo, y que tendría un triángulo a partir
(0, 0)
de(1, 0)
a(1, 1)
y volver de nuevo a(0, 0)
. Todas estas transformaciones cambian la densidad de manera uniforme. Lo que has hecho es elegir uniformemente un punto aleatorio en el triángulo e invertir el proceso para obtener un punto en el círculo.fuente
b < a
podemos lograr esto! por ejemplo, en javascript jsfiddle.net/b0sb5ogL/1Tenga en cuenta la densidad de puntos en proporcional al inverso cuadrado del radio, por lo tanto, en lugar de escoger
r
entre[0, r_max]
, elegir[0, r_max^2]
, a continuación, calcular sus coordenadas como:Esto le dará una distribución de puntos uniforme en un disco.
http://mathworld.wolfram.com/DiskPointPicking.html
fuente
Piensa en ello de esta manera. Si tiene un rectángulo donde un eje es radio y uno es ángulo, y toma los puntos dentro de este rectángulo que están cerca del radio 0. Todos estos caerán muy cerca del origen (que están muy juntos en el círculo). Sin embargo, los puntos cercanos al radio R, todos caerán cerca del borde del círculo (es decir, muy separados entre sí).
Esto podría darle una idea de por qué está teniendo este comportamiento.
El factor que se deriva en ese enlace le indica la cantidad de área correspondiente en el rectángulo que debe ajustarse para no depender del radio una vez que se asigna al círculo.
Editar: Entonces, lo que escribe en el enlace que comparte es: "Eso es bastante fácil de hacer calculando el inverso de la distribución acumulativa, y obtenemos para r:".
La premisa básica es que puede crear una variable con una distribución deseada de un uniforme mapeando el uniforme mediante la función inversa de la función de distribución acumulativa de la función de densidad de probabilidad deseada. ¿Por qué? Simplemente dé por sentado por ahora, pero esto es un hecho.
Aquí está mi explicación intuitiva somehwat de las matemáticas. La función de densidad f (r) con respecto a r tiene que ser proporcional a r misma. Comprender este hecho es parte de cualquier libro de cálculo básico. Ver secciones sobre elementos del área polar. Algunos otros carteles han mencionado esto.
Entonces lo llamaremos f (r) = C * r;
Esto resulta ser la mayor parte del trabajo. Ahora, dado que f (r) debería ser una densidad de probabilidad, puede ver fácilmente que integrando f (r) en el intervalo (0, R) obtiene C = 2 / R ^ 2 (este es un ejercicio para el lector .)
Por lo tanto, f (r) = 2 * r / R ^ 2
OK, así es como obtienes la fórmula en el enlace.
Luego, la parte final va desde la variable aleatoria uniforme u en (0,1) que debe mapear por la función inversa de la función de distribución acumulativa de esta densidad deseada f (r). Para comprender por qué este es el caso, debe encontrar un texto de probabilidad avanzado como Papoulis probablemente (o derivarlo usted mismo).
Integrando f (r) obtienes F (r) = r ^ 2 / R ^ 2
Para encontrar la función inversa de esto, establezca u = r ^ 2 / R ^ 2 y luego resuelva para r, que le da r = R * sqrt (u)
Esto también tiene un sentido intuitivo, u = 0 debería correlacionarse con r = 0. Además, u = 1 debería correlacionarse con r = R. Además, sigue la función de raíz cuadrada, que tiene sentido y coincide con el enlace.
fuente
La razón por la cual la solución ingenua no funciona es que da una mayor densidad de probabilidad a los puntos más cercanos al centro del círculo. En otras palabras, el círculo que tiene radio r / 2 tiene probabilidad r / 2 de obtener un punto seleccionado en él, pero tiene área (número de puntos) pi * r ^ 2/4.
Por lo tanto, queremos que una densidad de probabilidad de radio tenga la siguiente propiedad:
La probabilidad de elegir un radio menor o igual a una r dada tiene que ser proporcional al área del círculo con radio r. (porque queremos tener una distribución uniforme en los puntos y áreas más grandes significan más puntos)
En otras palabras, queremos que la probabilidad de elegir un radio entre [0, r] sea igual a su parte del área general del círculo. El área total del círculo es pi * R ^ 2, y el área del círculo con radio r es pi * r ^ 2. Por lo tanto, nos gustaría que la probabilidad de elegir un radio entre [0, r] sea (pi * r ^ 2) / (pi * R ^ 2) = r ^ 2 / R ^ 2.
Ahora viene la matemática:
La probabilidad de elegir un radio entre [0, r] es la integral de p (r) dr de 0 a r (eso es solo porque sumamos todas las probabilidades de los radios más pequeños). Por lo tanto, queremos integral (p (r) dr) = r ^ 2 / R ^ 2. Podemos ver claramente que R ^ 2 es una constante, por lo que todo lo que tenemos que hacer es descubrir qué p (r), cuando se integra, nos daría algo así como r ^ 2. La respuesta es claramente r * constante. integral (r * constante dr) = r ^ 2/2 * constante. Esto tiene que ser igual a r ^ 2 / R ^ 2, por lo tanto constante = 2 / R ^ 2. Por lo tanto, tiene la distribución de probabilidad p (r) = r * 2 / R ^ 2
Nota: Otra forma más intuitiva de pensar sobre el problema es imaginar que está tratando de dar a cada círculo de radio una densidad de probabilidad igual a la proporción del número de puntos que tiene en su circunferencia. Por lo tanto, un círculo que tiene radio r tendrá 2 * pi * r "puntos" en su circunferencia. El número total de puntos es pi * R ^ 2. Por lo tanto, debe dar al círculo una probabilidad de ra igual a (2 * pi * r) / (pi * R ^ 2) = 2 * r / R ^ 2. Esto es mucho más fácil de entender y más intuitivo, pero no es tan matemáticamente sólido.
fuente
Deje ρ (radio) y φ (acimut) ser dos variables aleatorias correspondientes a coordenadas polares de un punto arbitrario dentro del círculo. Si los puntos están distribuidos uniformemente, ¿cuál es la función de distribución de ρ y φ?
Para cualquier r: 0 <r <R, la probabilidad de que la coordenada del radio ρ sea menor que r es
P [ρ <r] = P [el punto está dentro de un círculo de radio r] = S1 / S0 = (r / R) 2
Donde S1 y S0 son las áreas de círculo de radio r y R respectivamente. Entonces el CDF se puede dar como:
Y PDF:
Tenga en cuenta que para R = 1 variable aleatoria sqrt (X) donde X es uniforme en [0, 1) tiene este CDF exacto (porque P [sqrt (X) <y] = P [x <y ** 2] = y * * 2 para 0 <y <= 1).
La distribución de φ es obviamente uniforme de 0 a 2 * π. Ahora puede crear coordenadas polares aleatorias y convertirlas a cartesianas utilizando ecuaciones trigonométricas:
No puedo resistirme a publicar código python para R = 1.
Conseguirás
fuente
Realmente depende de lo que quieras decir con "uniformemente aleatorio". Este es un punto sutil y puede leer más al respecto en la página wiki aquí: http://en.wikipedia.org/wiki/Bertrand_paradox_%28probability%29 , donde el mismo problema, dando diferentes interpretaciones a 'uniformemente aleatorio' da diferentes respuestas!
Dependiendo de cómo elija los puntos, la distribución podría variar, aunque en algún sentido sean uniformemente aleatorios .
Parece que la entrada del blog está tratando de hacerlo uniformemente aleatorio en el siguiente sentido: si toma un sub-círculo del círculo, con el mismo centro, entonces la probabilidad de que el punto caiga en esa región es proporcional al área de la región. Creo que está intentando seguir la interpretación ahora estándar de 'uniformemente aleatorio' para regiones 2D con áreas definidas en ellas : la probabilidad de que un punto caiga en cualquier región (con un área bien definida) es proporcional al área de esa región.
fuente
Aquí está mi código de Python para generar
num
puntos aleatorios a partir de un círculo de radiorad
:fuente
r = np.sqrt(np.random.uniform(0.0, rad**2, num))
?Creo que en este caso el uso de coordenadas polares es una forma de complicar el problema, sería mucho más fácil si selecciona puntos aleatorios en un cuadrado con lados de longitud 2R y luego selecciona los puntos de
(x,y)
tal manerax^2+y^2<=R^2
.fuente
Solución en Java y el ejemplo de distribución (2000 puntos)
basado en la solución anterior https://stackoverflow.com/a/5838055/5224246 de @sigfpe
fuente
Primero generamos un cdf [x] que es
La probabilidad de que un punto sea menor que la distancia x desde el centro del círculo. Suponga que el círculo tiene un radio de R.
obviamente si x es cero, entonces cdf [0] = 0
obviamente si x es R entonces el cdf [R] = 1
obviamente si x = r entonces el cdf [r] = (Pi r ^ 2) / (Pi R ^ 2)
Esto se debe a que cada "área pequeña" en el círculo tiene la misma probabilidad de ser recogida, por lo que la probabilidad es proporcional al área en cuestión. Y el área dada una distancia x desde el centro del círculo es Pi r ^ 2
entonces cdf [x] = x ^ 2 / R ^ 2 porque el Pi se cancela entre sí
tenemos cdf [x] = x ^ 2 / R ^ 2 donde x va de 0 a R
Entonces resolvemos para x
Ahora podemos reemplazar cdf con un número aleatorio de 0 a 1
Finalmente
obtenemos las coordenadas polares {0.601168 R, 311.915 grados}
fuente
Existe una relación lineal entre el radio y el número de puntos "cerca" de ese radio, por lo que necesita usar una distribución de radio que también haga que el número de puntos de datos cerca de un radio sea
r
proporcionalr
.fuente
Una vez utilicé este método: esto puede no ser optimizado por completo (es decir, utiliza una matriz de puntos, por lo que no se puede usar para círculos grandes), pero proporciona una distribución aleatoria suficiente. Puede omitir la creación de la matriz y dibujar directamente si lo desea. El método consiste en aleatorizar todos los puntos en un rectángulo que caen dentro del círculo.
fuente
El elemento de área en un círculo es dA = rdr * dphi. Ese factor adicional r destruyó su idea de elegir aleatoriamente ar y phi. Mientras que phi se distribuye plano, r no lo es, pero plano en 1 / r (es decir, es más probable que llegue al límite que "el blanco").
Entonces, para generar puntos distribuidos uniformemente sobre el círculo, elija phi de una distribución plana y r de una distribución 1 / r.
Alternativamente, use el método Monte Carlo propuesto por Mehrdad.
EDITAR
Para elegir una r plana aleatoria en 1 / r, puede elegir una x aleatoria del intervalo [1 / R, infinito] y calcular r = 1 / x. r luego se distribuye plano en 1 / r.
Para calcular un phi aleatorio, elija una x aleatoria del intervalo [0, 1] y calcule phi = 2 * pi * x.
fuente
No sé si esta pregunta todavía está abierta para una nueva solución con todas las respuestas ya dadas, pero resultó que me enfrenté exactamente a la misma pregunta. Traté de "razonar" conmigo mismo para encontrar una solución, y encontré una. Puede ser lo mismo que algunos ya han sugerido aquí, pero de todos modos aquí está:
Para que dos elementos de la superficie del círculo sean iguales, suponiendo dr iguales, debemos tener dtheta1 / dtheta2 = r2 / r1. Escribir la expresión de la probabilidad de ese elemento como P (r, theta) = P {r1 <r <r1 + dr, theta1 <theta <theta + dtheta1} = f (r, theta) * dr * dtheta1, y establecer los dos probabilidades (para r1 y r2) iguales, llegamos a (suponiendo que r y theta son independientes) f (r1) / r1 = f (r2) / r2 = constante, lo que da f (r) = c * r. Y el resto, determinar la constante c se deduce de la condición de que f (r) sea un PDF.
fuente
Una solución de programador:
El mapa de bits solo es necesario para la explicación de la lógica. Este es el código sin el mapa de bits:
fuente
Todavía no estoy seguro sobre el '(2 / R2) × r' exacto, pero lo que es evidente es el número de puntos necesarios para distribuir en la unidad dada 'dr', es decir, el aumento en r será proporcional a r2 y no a r.
verifique de esta manera ... el número de puntos en algún ángulo theta y entre r (0.1r a 0.2r), es decir, la fracción de r y el número de puntos entre r (0.6r a 0.7r) sería igual si usa la generación estándar, ya que la diferencia es solo 0.1r entre dos intervalos. pero dado que el área cubierta entre puntos (0.6r a 0.7r) será mucho más grande que el área cubierta entre 0.1r a 0.2r, el mismo número de puntos estará escasamente espaciado en un área más grande, supongo que ya lo sabe, así que la función para generar los puntos aleatorios no debe ser lineal sino cuadrático (ya que el número de puntos que se deben distribuir en la unidad dada 'dr', es decir, el aumento de r será proporcional a r2 y no r), por lo que en este caso será inverso a cuadrático, desde el delta tenemos (0.
fuente
Un problema tan divertido.
La razón de la probabilidad de que un punto sea elegido bajando a medida que aumenta la distancia desde el origen del eje se explica varias veces más arriba. Nos damos cuenta de eso tomando la raíz de U [0,1]. Aquí hay una solución general para una r positiva en Python 3.
fuente
También puedes usar tu intuición.
El área de un círculo es
pi*r^2
por
r=1
Esto nos da un área de
pi
. Supongamos que tenemos algún tipo de funciónf
que distribuiríaN=10
puntos uniformemente dentro de un círculo. La relación aquí es10 / pi
Ahora duplicamos el área y la cantidad de puntos
Para
r=2
yN=20
Esto da un área de
4pi
y la relación es ahora20/4pi
o10/2pi
. La relación se hará cada vez más pequeña cuanto mayor sea el radio, porque su crecimiento es cuadrático y elN
escalas linealmente.Para arreglar esto solo podemos decir
Si generas un vector en coordenadas polares como esta
Más puntos aterrizarían alrededor del centro.
length
ya no se distribuye uniformemente, pero el vector ahora se distribuirá uniformemente.fuente
1) Elija una X aleatoria entre -1 y 1.
2) Usando la fórmula del círculo, calcule los valores máximos y mínimos de Y dado que X y un radio de 1:
3) Elija una Y aleatoria entre esos extremos:
4) Incorpore sus valores de ubicación y radio en el valor final:
fuente