Digamos que quiero generar un conjunto de números aleatorios a partir del intervalo (a, b)
. La secuencia generada también debe tener la propiedad de que está ordenada. Puedo pensar en dos formas de lograr esto.
Deje n
ser la longitud de la secuencia que se generará.
1er algoritmo:
Let `offset = floor((b - a) / n)`
for i = 1 up to n:
generate a random number r_i from (a, a+offset)
a = a + offset
add r_i to the sequence r
2do algoritmo:
for i = 1 up to n:
generate a random number s_i from (a, b)
add s_i to the sequence s
sort(r)
Mi pregunta es, ¿el algoritmo 1 produce secuencias que son tan buenas como las generadas por el algoritmo 2?
random-generation
ultrajohn
fuente
fuente
R
rand_array <- replicate(k, sort(runif(n, a, b))
Respuestas:
El primer algoritmo falla gravemente por dos razones:
Para conocer muchas más formas (divertidas) de simular variaciones uniformes independientes, consulte Simulación de sorteos de una distribución uniforme mediante sorteos de una distribución normal .
Aquí está el
R
código que produjo la figura.fuente
El primer algoritmo produce números demasiado espaciados uniformemente
Ver también series de baja discrepancia .
(Como se ha señalado, esto puede ser por ejemplo una propiedad deseada para la estratificación. Serie de baja discrepancia como Halton y Sobel no tienen sus casos de uso.)
Un enfoque adecuado pero costoso (para valores reales)
... es usar números aleatorios distribuidos en beta. La estadística de orden de rango de la distribución uniforme es beta distribuida. Puede usar esto para dibujar aleatoriamente el más pequeño , luego el segundo más pequeño, ... repita.
Lo que produce el siguiente algoritmo:
Puede haber inestabilidades numéricas involucradas, y la computación
pow
y una división para cada objeto pueden resultar más lentas que la clasificación.Para valores enteros puede que necesite usar una distribución diferente.
Ordenar es increíblemente barato, así que solo úsalo
fuente
También depende de lo que esté haciendo con los números aleatorios. Para los problemas de integración numérica, el método uno (cuando se corrige quitando el operador de piso) produciría un conjunto de puntos superior. Lo que está haciendo es una forma de muestreo estratificado y tiene la ventaja de que evita la aglomeración. Es imposible obtener todos sus valores en el rango 0- (ba) / n, por ejemplo. Dicho esto para otras aplicaciones, esto podría ser muy malo, depende de lo que quieras hacer con él.
fuente