A distribuição de Pareto é uma distribuição de probabilidade que surge muito na natureza. Possui muitas propriedades especiais, como uma média infinita. Neste desafio, você produzirá um número amostrado dessa distribuição.
A Distribuição de Pareto é definida como maior ou igual a x
com probabilidade 1/x
, para todos x
maiores ou iguais a 1.
Portanto, um número amostrado dessa distribuição é maior ou igual a 1 com probabilidade 1, maior ou igual a 2 com probabilidade exatamente 1/2, maior ou igual a 3 com probabilidade exatamente 1/3, maior ou igual a 11.4 com probabilidade exatamente 1/11.4, e assim por diante.
Como você fará uma amostra dessa distribuição, seu programa ou função não receberá nenhuma entrada e emitirá um número aleatório, com as probabilidades acima. No entanto, se o seu programa não corresponder perfeitamente às probabilidades acima devido à impressão de ponto flutuante, tudo bem. Veja o final do desafio para mais detalhes.
(Isso é chamado de Distribuição de Pareto com alfa 1 e limite inferior 1, para ser exato)
Aqui estão 10 exemplos desta distribuição:
1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156
Observe como 5 deles estão abaixo de 2 e 5 estão acima de 2. Como esse é o resultado médio, poderia ter sido maior ou menor, é claro.
Sua resposta só precisa estar correta até os limites do seu tipo de ponto flutuante, número real ou qualquer outra coisa que você usar, mas você deve ser capaz de representar números com pelo menos três dígitos decimais de precisão e representar até 1.000.000 . Se você não tiver certeza se algo está bem, não hesite em perguntar.
Isso é código de golfe.
Detalhes sobre imprecisão:
Para cada intervalo
[a, b]
, onde1 <= a < b
a probabilidade ideal de que a amostra caia nesse intervalo1/a - 1/b
. A probabilidade de seu programa produzir um número nesse intervalo deve estar com0.001
de1/a - 1/b
. SeX
é a saída do seu programa, é necessário isso|P(a <= X <= b) - (1/a - 1/b)| < 0.001
.Observe que, ao aplicar a regra acima com
a=1
eb
suficientemente grande, é possível que seu programa produza um número maior ou igual a 1 com pelo menos probabilidade 0,999. O resto do tempo pode travar, gerar saídaInfinity
ou fazer o que mais.
Estou bastante certo de que os envios existentes do formulário 1/1-x
ou 1/x
, onde x
há uma flutuação aleatória no [0, 1)
ou(0, 1)
ou [0, 1]
, todos atendem a esse requisito.
fonte
Respostas:
MATL , 3 bytes
Experimente online! Ou estime as probabilidades resultantes executando 10000 vezes.
Explicação
fonte
Na verdade , 4 bytes
Experimente online!
Explicação:
fonte
R, 10 bytes
Bem direto.
fonte
runif
nunca retorna 0 ou 1 no caso padrão, portanto, não há problemas com isso.runif
dar 1 seja nula, a probabilidade de1/runif
dar 1 não é, devido à precisão do ponto flutuante ( ie tipicamente 1 / 0.9999999 retorna 1 em R).TI-Basic, 2 bytes
Para quem está se perguntando,
rand
retorna um valor aleatório em (0,1]. "Devido às especificidades do algoritmo de geração de número aleatório, o menor número possível de gerar é um pouco maior que 0. O maior número possível é realmente 1 ... "( origem ). Por exemplo, semear rand com 196164532 produz 1.fonte
rand
mais útil como sub-rotina para os outros comandos da calculadora, e é provavelmente por isso que a TI tomou essa decisão de design. Por exemplo,randNorm(0,1
retorna-7.02129...
com a semente 196164532. O uso do algoritmo RNG sem o ajuste forneceria um valor de1e99
, que é um valor irracional para uma variável normalmente distribuída.R , 12 bytes
Experimente online!
Verifique a distribuição
Isso adota uma abordagem diferente, explorando o fato de que se
Y~exp(alpha)
, então,X=x_m*e^Y
é um Pareto com parâmetrosx_m,alpha
. Como os dois parâmetros são 1, e o parâmetro de taxa padrão pararexp
1, isso resulta na distribuição Pareto apropriada.Embora essa resposta seja uma abordagem bastante específica para R, infelizmente é menos eficiente do que a do plannapus .
R , 14 bytes
Experimente online!
Ainda menos golfe, mas outra maneira de obter a resposta.
Outra propriedade da distribuição exponencial é que se
X ~ Exp(λ) then e^−X ~ Beta(λ, 1)
, portanto,1/Beta(1,1)
é aPareto(1,1)
.Além disso, um observador atento lembraria que se
X ~ Beta(a,b)
ea=b=1
, então,X~Unif(0,1)
, é verdade1/runif(1)
.fonte
actuar::rpareto(1,1,1)
porque é mais longa :)Carvão , 10 bytes
Experimente online!
O link é para a versão detalhada:
Comentários:
1/(1-R)
fórmula: Nesse caso, N é definido como 1000000, pois o OP solicita que seja o mínimo. Para obter esse número, o Charcoal fornece uma variável predefinidaf
= 1000. Então, apenas calculandof^2
, obtemos 1000000. No caso de o número aleatório ser 999999 (o máximo)1/(1-0.999999)=1000000
,.1/(1-R/N)
ondeR
é um número aleatório entre 0 e N, que é o mesmo que apenas calcularN/(N-R)
. Mas, considerando que os números inteiros aleatóriosN-R
eR
têm a mesma probabilidade de ocorrer, que é o mesmo que apenas calcularN/R
(sendoR
neste último caso um número entre 1 e N inclusive a divisão evitar por zero).fonte
MapAssignRight
mais, 10 bytes! trabalho.Haskell ,
6156 bytesA função
randomIO :: IO Float
produz números aleatórios no intervalo[0,1)
, portanto, transformá-los usandox -> 1/(1-x)
produzirá realizações de pareto.Experimente online!
fonte
randomIO>>=print.((1::Float)/)
main=
.[0,1)
acordo com esta resposta #Excel, 9 bytes
Sim, o Excel é (semi-) competitivo para variar!
fonte
=1/Rand(
)Mathematica, 10 bytes
Experimente online!
-4 bytes de M.Stern
fonte
RandomReal
outputs a real number in the closed range[0, 1]
. Thus, division by 0 is possible. You’ll need to manipulate the random value in order to remove that possibility.the burden of proof should be on the person claiming to have a valid answer
- it's your work to prove that it's valid, not to ask @Mego to provide an invalid test case. Also because float are discrete the probability to get 0 is nonzero.$MinMachineNumber
. Try this:Table[RandomReal[{0, $MinMachineNumber}], 100]
. Turns out Mathematica is smart enough to abandon machine numbers and switch over to arbitrary precision numbers. LOL.Ruby,
148 bytesTrivial program, I don't think it can get any shorter.
fonte
Excel VBA, 6 Bytes
Anonymous VBE immediate window function that takes no input and outputs to the VBE immediate window
fonte
Python, 41 bytes
Try it online!
Using the builtin is actually longer:
Python, 43 bytes
Try it online!
Both solutions work in both Python 2 and Python 3.
fonte
print
saves a byte.J, 5 bytes
How ot works:
?0
generates a random value greater than 0 and less than 1-.
subtract from 1%
reciprocalTry it online!
fonte
Red, 19 bytes
Try it online!
fonte
APL (Dyalog), 5 bytes
Try it online!
How?
fonte
Japt, 6 bytes
1/1-Mr
is the same length but this felt a little less boring!Try it
Explanation
Increment (
°
) zero (T
) and divide by (/
) its absolute difference (a
) withMath.random()
.fonte
Jelly, 5 bytes
Jelly also doesn't have random float, so this uses
x/n
wherex
is an random integer in range[1, n]
(inclusive) to emulate a random float in range(0, 1]
. In this programn
is set to be108
.Try it online!
Explanation
Enlist, 3 bytes
Try it online!
Enlist beats Jelly! (TI-Basic not yet)
Explanation
Of course this has nonzero probability of take the inverse of 0.
fonte
ØX
returned0
? (Disclaimer: I don't know Enlist at all!)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
(from the challenge rules)IBM/Lotus Notes Formula, 13 bytes
Sample (10 runs)
fonte
Java 8,
2218 bytes(Old answer before the rules changed:
v->1/(1-Math.random())
)Try it here.
fonte
JavaScript REPL, 15
19bytesfonte
Math.random()
returns 01/(1-Math.random())
?_=>
at the start to make this a function; snippets aren't allowed.Pyt, 2 bytes
Explanation:
Try it online!
fonte
J, 9 Bytes
I couldn't figure out how to make it take no input, since p=:%?0 would evaluate immediately and remain fixed. Because of this its sort of long.
How it works:
Evaluated 20 times:
fonte
Pyth, 4 bytes
Try it here!
Alternative:
c1h_O0
.fonte
c1tOZ
is 5, does it not work?1-n
notn-1
100
?100
AFAIKClean, 91 bytes
Clean doesn't like random numbers.
Because the random generator (a Mersenne Twister) needs to be given a seed, I have to take the system timestamp to get something that differs passively per-run, and to do anything IO-related I need to use a whole
Start
declaration because it's the only place to obtain aWorld
.Try it online!
fonte