Muestra de la distribución de Pareto


22

La distribución de Pareto es una distribución de probabilidad que surge mucho en la naturaleza. Tiene muchas propiedades especiales, como una media infinita. En este desafío, generará un número de muestra de esta distribución.

La distribución de Pareto se define como mayor o igual que xcon probabilidad 1/x, para todos xmayor o igual que 1.

Por lo tanto, un número muestreado de esta distribución es mayor o igual a 1 con probabilidad 1, mayor o igual a 2 con probabilidad exactamente 1/2, mayor o igual a 3 con probabilidad exactamente 1/3, mayor o igual a 11.4 con probabilidad exactamente 1 / 11.4, y así sucesivamente.

Como tomará una muestra de esta distribución, su programa o función no tomará ninguna entrada y generará un número aleatorio con las probabilidades anteriores. Sin embargo, si su programa no coincide perfectamente con las probabilidades anteriores debido a la impresión de punto flotante, está bien. Vea el fondo del desafío para más detalles.

(Esto se llama Distribución de Pareto con alfa 1 y límite inferior 1, para ser exactos)

Aquí hay 10 ejemplos de esta distribución:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

Observe cómo 5 de ellos están por debajo de 2 y 5 están por encima de 2. Dado que este es el resultado promedio, podría haber sido mayor o menor, por supuesto.

Su respuesta solo necesita ser correcta hasta los límites de su tipo de coma flotante, tipo de número real o cualquier otra cosa que use, pero debe poder representar números con al menos 3 dígitos decimales de precisión y representar números de hasta 1,000,000 . Si no está seguro de si algo está bien, no dude en preguntar.

Este es el código de golf.


Detalles sobre la imprecisión:

  • Para cada rango [a, b], donde 1 <= a < b, la probabilidad ideal de que la muestra caiga en ese rango es 1/a - 1/b. La probabilidad de que su programa produzca un número en ese rango debe ser 0.001de 1/a - 1/b. Si Xes la salida de su programa, se requiere que |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • Tenga en cuenta que al aplicar la regla anterior con a=1y bsuficientemente grande, es el caso de que su programa debe generar un número mayor o igual a 1 con al menos una probabilidad de 0,999. El resto del tiempo puede bloquearse, producirse Infinityo hacer cualquier otra cosa.

Estoy bastante seguro de que las presentaciones existentes de la forma 1/1-xo 1/x, donde xes un flotador al azar en [0, 1)o (0, 1), o [0, 1], todos satisfacen este requisito.



2
Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario. [perdón por el abuso de comentarios también, pero eso es lo que sucedería cuando OP cambie la pregunta significativamente]
user202729

Respuestas:




5

R, 10 bytes

1/runif(1)

Muy claro.


2
Tenga en cuenta que runif nunca devuelve 0 o 1 en el caso predeterminado, por lo que no hay problemas con esto.
Giuseppe

Si gracias. Y no lo pensé al ingresar esta respuesta, pero de hecho puedes verificar la distribución si es necesario.
plannapus

2
@Mego que es incorrecto. La distribución de Pareto es absolutamente continua y, por lo tanto, tiene la medida 0 para cualquier número.
Therkel

3
@Mego OK, eso puede ser arena movediza para mí (dado que no sé casi nada sobre punto flotante), pero en realidad creo que si bien la probabilidad de runifdar 1 es nula, la probabilidad de 1/runifdar 1 no lo es, debido a la precisión del punto flotante ( es decir, típicamente 1 / 0.9999999 devuelve 1 en R).
plannapus

1
@plannapus Hmm ... Ese es un buen punto. Los flotadores hacen que esto sea demasiado complicado.
Mego

4

TI-Basic, 2 bytes

rand^-1      (AB 0C in hex)

Para cualquiera que se pregunte, randdevuelve un valor aleatorio en (0,1]. "Debido a los detalles del algoritmo de generación de números aleatorios, el número más pequeño posible de generar es ligeramente mayor que 0. El número más grande posible es en realidad 1 ... "( fuente ). Por ejemplo, sembrar rand con 196164532 produce 1.


Curiosamente, el código equivalente no funcionaría en una calculadora de la serie TI-89. Aunque sus generadores de números aleatorios se implementan de forma casi idéntica, una TI-89 devolverá 0 siempre que una TI-83 + devuelva 0.99999999999889.
Misha Lavrov

2
Los desarrolladores de TI-Basic sabían de antemano que este desafío sucederá ...? Parece ganar esta vez.
user202729

@ user202729 Evitar 0 y 1 es randmás útil como subrutina para los otros comandos de la calculadora, por lo que TI probablemente tomó esta decisión de diseño. Por ejemplo, randNorm(0,1regresa -7.02129...con la semilla 196164532. El uso del algoritmo RNG sin el ajuste daría un valor de 1e99, que es un valor irracional para una variable normalmente distribuida.
Misha Lavrov

@ user202729 Sí, en realidad solo viajé un poco por el tiempo para hacerlo todo. Definitivamente vale la pena por estos votos a favor.
Timtech

4

R , 12 bytes

exp(rexp(1))

Pruébalo en línea!

Verificar la distribución.

Esto toma un enfoque diferente, explotando el hecho de que si Y~exp(alpha), entonces X=x_m*e^Yes un Pareto con parámetros x_m,alpha. Dado que ambos parámetros son 1 y el parámetro de velocidad predeterminado para rexp1 es, esto da como resultado la distribución de Pareto adecuada.

Si bien esta respuesta es un enfoque bastante específico de R, lamentablemente es menos golfoso que el plannapus ' .

R , 14 bytes

1/rbeta(1,1,1)

Pruébalo en línea!

Incluso menos golfista, pero otra forma de llegar a la respuesta.

Otra propiedad de la distribución exponencial es que si X ~ Exp(λ) then e^−X ~ Beta(λ, 1), por 1/Beta(1,1)lo tanto, es a Pareto(1,1).

Además, un observador entusiasta recordaría que si X ~ Beta(a,b)y a=b=1, entonces X~Unif(0,1), así es realmente 1/runif(1).


No tengo idea. Pero la realidad es que existe una gran confusión sobre lo que está permitido y lo que no está en este desafío.
user202729

@ user202729 es justo, pero aquellos que han estado expresando inquietudes con respecto a eso al menos habrían comentado, por lo que el voto negativo es (en mi opinión) poco probable que esté relacionado con eso. EDITAR: misterio downvoter ha eliminado el downvote.
Giuseppe

Voté en contra porque pensé que usar R en un desafío como este era trivial, pero estaba un poco feliz. Me doy cuenta de que esto usa un método diferente que la mayoría de las otras respuestas, así que eliminé mi voto negativo.
KSmarts

@KSmarts La respuesta "trivial" en R no fue utilizada por nadie en realidad: actuar::rpareto(1,1,1)porque es más larga :)
plannapus

Para información, hay ca. 20 distribuciones codificadas en la base R, pero Pareto no es una de ellas, de ahí la necesidad de usar una solución alternativa o un paquete adicional.
plannapus

3

Carbón de leña , 10 bytes

I∕Xφ²⊕‽Xφ²

Pruébalo en línea!

El enlace es a la versión detallada:

Print(Cast(Divide(Power(f, 2), ++(Random(Power(f, 2))))));

Comentarios:

  • El carbón solo tiene métodos para obtener números enteros aleatorios, por lo que para obtener un número aleatorio de coma flotante entre 0 y 1 tenemos que obtener un número entero aleatorio entre 0 y N y dividirlo por N.
  • Versión anterior de esta respuesta que usaba la 1/(1-R)fórmula: en este caso, N se establece en 1000000 ya que el OP le pide que sea el mínimo. Para obtener este número, el carbón vegetal proporciona una variable predeterminada f= 1000. Por lo que sólo el cálculo f^2obtenemos 1000000. En el caso de que el número aleatorio es 999999 (el máximo), 1/(1-0.999999)=1000000.
  • Consejo de Neil (ahorro de 3 bytes): si tengo 1/(1-R/N)donde Rhay un número aleatorio entre 0 y N, es lo mismo que calcular N/(N-R). Pero teniendo en cuenta que los enteros aleatorios N-Ry Rla misma probabilidad de que ocurran, es lo mismo que calcular N/R(siendo Ren este último caso un número entre 1 y N inclusive para evitar la división por cero).


@Neil por favor espera un momento mientras trato de entender lo que hace tu código ... :-)
Charlie

En realidad no necesito MapAssignRightmás, ¡ 10 bytes! trabajos.
Neil

@Neil asimilación de su código completado! Respuesta editada. :-D
Charlie

3

Haskell , 61 56 bytes

La función randomIO :: IO Floatproduce números aleatorios en el intervalo [0,1) , por lo que transformarlos usando x -> 1/(1-x)producirá realizaciones pareto.

import System.Random
randomIO>>=print.(1/).((1::Float)-)

Pruébalo en línea!


Mover la anotación de tipo ahorra algunos bytes:randomIO>>=print.((1::Float)/)
Laikoni

Y como las funciones están permitidas, diría que puede soltar el main=.
Laikoni

Desde el punto de vista de la evaluación, el rango está de [0,1)acuerdo con esta respuesta
error

@flawr ¡Vaya, tienes razón! Olvidé cómo funcionan los flotadores temporalmente.
Mego

Bueno, de todos modos, gracias por comentar, no habría tenido idea :)
error

3

Excel, 9 bytes

=1/rand()

¡Sí, Excel es (semi) competitivo para variar!


También funciona en LibreOffice Calc :)
ElPedro

Puede cambiar esto a las hojas de Google por -1 Bytes ( =1/Rand()
Taylor Scott

3

Mathematica, 10 bytes

1/Random[]

Pruébalo en línea!

-4 bytes de M.Stern


2
Esto tiene el potencial de fallar, porque RandomRealgenera un número real en el rango cerrado [0, 1]. Por lo tanto, la división por 0 es posible. Tendrá que manipular el valor aleatorio para eliminar esa posibilidad.
Mego

2
@Mego, ¿dónde encontraste exactamente esa información?
J42161217

1
@Mego, ¿cuál es la probabilidad de obtener 0?
J42161217

44
Jenny_mathy: Según la propuesta sobre meta, the burden of proof should be on the person claiming to have a valid answeres su trabajo demostrar que es válido, no pedirle a @Mego que proporcione un caso de prueba no válido. Además, debido a que los flotantes son discretos, la probabilidad de obtener 0 no es cero.
user202729

1
Volviendo al tema, no creo que exista la posibilidad de obtener un cero usando esta función. De hecho, Mathematica producirá números menores que $MinMachineNumber. Prueba esto: Table[RandomReal[{0, $MinMachineNumber}], 100]. Resulta que Mathematica es lo suficientemente inteligente como para abandonar los números de máquina y cambiar a números de precisión arbitrarios. Jajaja
Kelly Lowder

2

Rubí, 14 8 bytes

p 1/rand

Programa trivial, no creo que pueda acortarse.


Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario.
user202729

2

Excel VBA, 6 bytes

Función de ventana inmediata anónima de VBE que no lleva entradas y salidas a la ventana inmediata de VBE

?1/Rnd


1

J , 5 bytes

%-.?0

¿Cómo funciona?

?0 genera un valor aleatorio mayor que 0 y menor que 1

-. restar de 1

% recíproco

Pruébalo en línea!


Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario.
user202729


1

APL (Dyalog) , 5 bytes

÷1-?0

Pruébalo en línea!

¿Cómo?

 ÷   1-     ?0
1÷  (1-  random 0..1)

Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario.
user202729

1

Japt , 6 bytes

1/1-Mr tiene la misma longitud pero esto se sintió un poco menos aburrido!

°T/aMr

Intentalo


Explicación

Incremente ( °) cero ( T) y divida entre ( /) su diferencia absoluta ( a) con Math.random().


Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario.
user202729

1

Jalea , 5 bytes

Jelly tampoco tiene flotante aleatorio, por lo que usa x/nwhere xes un entero aleatorio en rango [1, n](inclusive) para emular un flotante aleatorio en rango (0, 1]. En este programa nestá configurado para ser .108

ȷ8µ÷X

Pruébalo en línea!

Explicación

ȷ8     Literal 10^8.
  µ    New monad.
   ÷   Divide by
    X  random integer.

Aliste , 3 bytes

ØXİ

Pruébalo en línea!

¡Aliste supera a Jelly! (TI-Basic aún no)

Explicación

  İ    The inverse of...
ØX     a random float in [0, 1)

Por supuesto, esto tiene una probabilidad distinta de cero de tomar el inverso de 0.


¿La solución Enlist no fallará si se ØXdevuelve 0? (Descargo de responsabilidad: ¡no sé Enlist en absoluto!)
Shaggy

@Shaggy your program must output a number greater than or equal to 1 with at least probability 0.999. The rest of the time it may crash(de las reglas del desafío)
usuario202729

1

Fórmula IBM / Lotus Notes, 13 bytes

1/(1-@Random)

Muestra (10 carreras)

ingrese la descripción de la imagen aquí


Nota para todos: issacg ha agregado algunas reglas que permiten algunas imprecisiones, por lo tanto, la mayoría de las respuestas aquí son más largas de lo necesario.
user202729

No estoy seguro de poder hacer esto mucho más corto, independientemente de los cambios de reglas que se realicen :)
ElPedro


1

JavaScript REPL, 15 19 bytes

1/Math.random()

3
Esto no arrojará resultados correctos si Math.random() devuelve 0
Mr. Xcoder

1
Probablemente 1/(1-Math.random())?
user202729

Solucionado con la solución de u * 29
l4m2

_=>Al principio necesita hacer esto una función; No se permiten fragmentos.
Shaggy

Es un programa completo que utiliza la consola en ejecución
l4m2


0

J, 9 bytes

p=:%@?@0:

No pude encontrar la manera de hacer que no tenga entrada, ya que p =:%? 0 se evaluaría de inmediato y permanecería fijo. Debido a esto es un poco largo.

Cómo funciona:

p=:        | Define the verb p
       0:  | Constant function. Returns 0 regardless of input.
     ?@    | When applied to 0, returns a random float in the range (0,1)
   %@      | Reciprocal

Evaluado 20 veces:

    p"0 i.20
1.27056 1.86233 1.05387 16.8991 5.77882 3.42535 12.8681 17.4852 2.09133 1.82233 2.28139 1.58133 1.79701 1.09794 1.18695 1.07028 3.38721 2.88339 2.06632 2.0793


0

Limpio , 91 bytes

import StdEnv,Math.Random,System.Time
Start w=1.0/(1.0-hd(genRandReal(toInt(fst(time w)))))

A Clean no le gustan los números aleatorios.

Debido a que el generador aleatorio (un Mersenne Twister) necesita una semilla, tengo que tomar la marca de tiempo del sistema para obtener algo que difiera pasivamente por ejecución, y para hacer cualquier cosa relacionada con IO necesito usar una Startdeclaración completa porque es la único lugar para obtener a World.

Pruébalo en línea!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.