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], donde1 <= a < b, la probabilidad ideal de que la muestra caiga en ese rango es1/a - 1/b. La probabilidad de que su programa produzca un número en ese rango debe ser0.001de1/a - 1/b. SiXes 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=1ybsuficientemente 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, producirseInfinityo 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.

Respuestas:
MATL , 3 bytes
Pruébalo en línea! O estimar las probabilidades resultantes ejecutándolo 10000 veces.
Explicación
fuente
En realidad , 4 bytes
Pruébalo en línea!
Explicación:
fuente
R, 10 bytes
Muy claro.
fuente
runifnunca devuelve 0 o 1 en el caso predeterminado, por lo que no hay problemas con esto.runifdar 1 es nula, la probabilidad de1/runifdar 1 no lo es, debido a la precisión del punto flotante ( es decir, típicamente 1 / 0.9999999 devuelve 1 en R).TI-Basic, 2 bytes
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.fuente
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 de1e99, que es un valor irracional para una variable normalmente distribuida.R , 12 bytes
Pruébalo en línea!
Verificar la distribución.
Esto toma un enfoque diferente, explotando el hecho de que si
Y~exp(alpha), entoncesX=x_m*e^Yes un Pareto con parámetrosx_m,alpha. Dado que ambos parámetros son 1 y el parámetro de velocidad predeterminado pararexp1 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
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), por1/Beta(1,1)lo tanto, es aPareto(1,1).Además, un observador entusiasta recordaría que si
X ~ Beta(a,b)ya=b=1, entoncesX~Unif(0,1), así es realmente1/runif(1).fuente
actuar::rpareto(1,1,1)porque es más larga :)Carbón de leña , 10 bytes
Pruébalo en línea!
El enlace es a la versión detallada:
Comentarios:
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 predeterminadaf= 1000. Por lo que sólo el cálculof^2obtenemos 1000000. En el caso de que el número aleatorio es 999999 (el máximo),1/(1-0.999999)=1000000.1/(1-R/N)dondeRhay un número aleatorio entre 0 y N, es lo mismo que calcularN/(N-R). Pero teniendo en cuenta que los enteros aleatoriosN-RyRla misma probabilidad de que ocurran, es lo mismo que calcularN/R(siendoRen este último caso un número entre 1 y N inclusive para evitar la división por cero).fuente
MapAssignRightmás, ¡ 10 bytes! trabajos.Haskell ,
6156 bytesLa función
randomIO :: IO Floatproduce números aleatorios en el intervalo[0,1), por lo que transformarlos usandox -> 1/(1-x)producirá realizaciones pareto.Pruébalo en línea!
fuente
randomIO>>=print.((1::Float)/)main=.[0,1)acuerdo con esta respuestaExcel, 9 bytes
¡Sí, Excel es (semi) competitivo para variar!
fuente
=1/Rand()Mathematica, 10 bytes
Pruébalo en línea!
-4 bytes de M.Stern
fuente
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.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.$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. JajajaRubí,
148 bytesPrograma trivial, no creo que pueda acortarse.
fuente
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
fuente
Python , 41 bytes
Pruébalo en línea!
Usar el builtin es en realidad más largo:
Python , 43 bytes
Pruébalo en línea!
Ambas soluciones funcionan tanto en Python 2 como en Python 3.
fuente
printguardar un byte.J , 5 bytes
¿Cómo funciona?
?0genera un valor aleatorio mayor que 0 y menor que 1-.restar de 1%recíprocoPruébalo en línea!
fuente
Rojo , 19 bytes
Pruébalo en línea!
fuente
APL (Dyalog) , 5 bytes
Pruébalo en línea!
¿Cómo?
fuente
Japt , 6 bytes
1/1-Mrtiene la misma longitud pero esto se sintió un poco menos aburrido!Intentalo
Explicación
Incremente (
°) cero (T) y divida entre (/) su diferencia absoluta (a) conMath.random().fuente
Jalea , 5 bytes
Jelly tampoco tiene flotante aleatorio, por lo que usa
x/nwherexes un entero aleatorio en rango[1, n](inclusive) para emular un flotante aleatorio en rango(0, 1]. En este programanestá configurado para ser .108Pruébalo en línea!
Explicación
Aliste , 3 bytes
Pruébalo en línea!
¡Aliste supera a Jelly! (TI-Basic aún no)
Explicación
Por supuesto, esto tiene una probabilidad distinta de cero de tomar el inverso de 0.
fuente
ØXdevuelve0? (Descargo de responsabilidad: ¡no sé Enlist en absoluto!)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)Fórmula IBM / Lotus Notes, 13 bytes
Muestra (10 carreras)
fuente
Java 8,
2218 bytes(Vieja respuesta ante las reglas cambiaron:
v->1/(1-Math.random()))Pruébalo aquí
fuente
JavaScript REPL, 15
19bytesfuente
Math.random()devuelve 01/(1-Math.random())?_=>Al principio necesita hacer esto una función; No se permiten fragmentos.Pyt , 2 bytes
Explicación:
Pruébalo en línea!
fuente
J, 9 bytes
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:
Evaluado 20 veces:
fuente
Pyth , 4 bytes
Pruébalo aquí!
Alternativa:
c1h_O0.fuente
c1tOZes 5, ¿no funciona?1-nnon-1100?100AFAIKLimpio , 91 bytes
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 aWorld.Pruébalo en línea!
fuente