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 x
con probabilidad 1/x
, para todos x
mayor 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.001
de1/a - 1/b
. SiX
es 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=1
yb
suficientemente 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, producirseInfinity
o hacer cualquier otra cosa.
Estoy bastante seguro de que las presentaciones existentes de la forma 1/1-x
o 1/x
, donde x
es 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
runif
nunca devuelve 0 o 1 en el caso predeterminado, por lo que no hay problemas con esto.runif
dar 1 es nula, la probabilidad de1/runif
dar 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,
rand
devuelve 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
rand
má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,1
regresa-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^Y
es un Pareto con parámetrosx_m,alpha
. Dado que ambos parámetros son 1 y el parámetro de velocidad predeterminado pararexp
1 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^2
obtenemos 1000000. En el caso de que el número aleatorio es 999999 (el máximo),1/(1-0.999999)=1000000
.1/(1-R/N)
dondeR
hay un número aleatorio entre 0 y N, es lo mismo que calcularN/(N-R)
. Pero teniendo en cuenta que los enteros aleatoriosN-R
yR
la misma probabilidad de que ocurran, es lo mismo que calcularN/R
(siendoR
en este último caso un número entre 1 y N inclusive para evitar la división por cero).fuente
MapAssignRight
más, ¡ 10 bytes! trabajos.Haskell ,
6156 bytesLa función
randomIO :: IO Float
produce 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
RandomReal
genera 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 answer
es 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
print
guardar un byte.J , 5 bytes
¿Cómo funciona?
?0
genera 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-Mr
tiene 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/n
wherex
es un entero aleatorio en rango[1, n]
(inclusive) para emular un flotante aleatorio en rango(0, 1]
. En este programan
está configurado para ser .108
Prué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
ØX
devuelve0
? (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
c1tOZ
es 5, ¿no funciona?1-n
non-1
100
?100
AFAIKLimpio , 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
Start
declaración completa porque es la único lugar para obtener aWorld
.Pruébalo en línea!
fuente