Creo que (una versión ligeramente modificada de) el método 2 es bastante sencillo, en realidad
Usando la definición de la función de distribución de Pareto dada en Wikipedia
FX(x)={1−(xmx)α0x≥xm,x<xm,
si toma y entonces la relación de a se maximiza en , lo que significa que puede escalar según la relación en y usar un muestreo de rechazo directo. Parece ser razonablemente eficiente.xm=12α=γpxqx=FX(x+12)−FX(x−12)x=1x=1
Para ser más explícito: si genera a partir de un Pareto con y y redondea al entero más cercano (en lugar de truncar), entonces parece posible utilizar el muestreo de rechazo con : cada valor generado de de ese proceso se acepta con probabilidad .xm=12α=γM=p1/q1xpxMqx
( aquí fue ligeramente redondeado ya que soy flojo; en realidad, el ajuste para este caso sería un poco diferente, pero no lo suficiente como para verse diferente en la trama; de hecho, la imagen pequeña hace que parezca un poco demasiado pequeño cuando en realidad es una fracción demasiado grande)M
Un ajuste más cuidadoso de y ( para entre 0 y 1) probablemente aumentaría aún más la eficiencia, pero este enfoque funciona razonablemente bien en los casos con los que he jugado.xmαα=γ−aa
Si puede dar una idea del rango típico de valores de , puedo echar un vistazo más de cerca a la eficiencia allí.γ
El método 1 se puede adaptar para ser exacto, también, realizando el método 1 casi siempre, y luego aplicando otro método para lidiar con la cola. Esto se puede hacer de maneras muy rápidas.
Por ejemplo, si toma un vector entero de longitud 256 y llena los primeros valores de con , los siguientes valores de con y así sucesivamente hasta , eso será casi usa toda la matriz. Las pocas celdas restantes indican luego pasar a un segundo método que combina el manejo de la cola derecha y también los pequeños bits de probabilidad 'sobrantes' de la parte izquierda.⌊256p1⌋1
⌊256p2⌋2
256pi<1
El remanente izquierdo se puede hacer mediante una serie de enfoques (incluso con, digamos 'cuadrar el histograma' si está automatizado, pero no tiene que ser tan eficiente como eso), y la cola derecha se puede hacer usando algo como el enfoque de aceptar-rechazar anterior.
El algoritmo básico consiste en generar un número entero de 1 a 256 (que requiere solo 8 bits del rng; si la eficiencia es primordial, las operaciones de bits pueden sacarlos de la parte superior, dejando el resto del número uniforme (lo mejor sería dejado como un valor entero no normalizado hasta este punto) que puede usarse para tratar el remanente izquierdo y la cola derecha si es necesario.
Cuidadosamente implementado, este tipo de cosas puede ser muy rápido. Puede usar diferentes valores de que 256 (por ejemplo, podría ser una posibilidad), pero no todo es igual. Sin embargo, si toma una tabla muy grande, puede que no queden suficientes bits en el uniforme para que sea adecuada para generar la cola y necesita un segundo valor uniforme allí (pero rara vez se necesita, por lo que no es demasiado un problema)2k216
En el mismo ejemplo de zeta (2) que el anterior, tendría 212 1
's, 26 2
' s, 7 3
's, 3 4
' s, uno 5
y los valores de 250-256 tratarían con el remanente. Más del 97% del tiempo genera uno de los valores de la tabla (1-5).