La distribution de Pareto est une distribution de probabilité qui revient beaucoup dans la nature. Il possède de nombreuses propriétés spéciales, telles qu'une moyenne infinie. Dans ce défi, vous allez sortir un nombre échantillonné à partir de cette distribution.
La distribution de Pareto est définie comme étant supérieure ou égale à x
avec probabilité 1/x
, pour tous x
supérieure ou égale à 1.
Par conséquent, un nombre échantillonné à partir de cette distribution est supérieur ou égal à 1 avec probabilité 1, supérieur ou égal à 2 avec probabilité exactement 1/2, supérieur ou égal à 3 avec probabilité exactement 1/3, supérieur ou égal à 11,4 avec probabilité exactement 1 / 11,4, et ainsi de suite.
Puisque vous échantillonnerez cette distribution, votre programme ou fonction ne prendra aucune entrée et produira un nombre aléatoire, avec les probabilités ci-dessus. Cependant, si votre programme ne correspond pas parfaitement aux probabilités ci-dessus en raison d'une impression en virgule flottante, c'est OK. Voir le bas du défi pour plus de détails.
(C'est ce qu'on appelle la distribution de Pareto avec alpha 1 et borne inférieure 1, pour être exact)
Voici 10 exemples tirés de cette distribution:
1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156
Remarquez comment 5 d'entre eux sont inférieurs à 2 et 5 supérieurs à 2. Comme il s'agit du résultat moyen, il aurait pu être supérieur ou inférieur, bien sûr.
Votre réponse ne doit être correcte que dans les limites de votre type à virgule flottante, type à nombre réel ou tout autre élément que vous utilisez, mais vous devez être en mesure de représenter des nombres avec au moins 3 chiffres décimaux de précision et des nombres jusqu'à 1 000 000 . Si vous ne savez pas si quelque chose va bien, n'hésitez pas à demander.
C'est le golf de code.
Détails sur l'imprécision:
Pour chaque plage
[a, b]
, où1 <= a < b
, la probabilité idéale que l'échantillon tombe dans cette plage est1/a - 1/b
. La probabilité que votre programme produise un nombre dans cette plage doit être0.001
de1/a - 1/b
. SiX
est la sortie de votre programme, il est nécessaire que|P(a <= X <= b) - (1/a - 1/b)| < 0.001
.Notez qu'en appliquant la règle ci-dessus avec
a=1
etb
suffisamment grand, il est vrai que votre programme doit sortir un nombre supérieur ou égal à 1 avec au moins une probabilité de 0,999. Le reste du temps, il peut planter, produireInfinity
ou faire autre chose.
Je suis assez certain que les soumissions existantes du formulaire 1/1-x
ou 1/x
, où x
est un flottant aléatoire dans [0, 1)
ou (0, 1)
ou [0, 1]
, satisfont toutes à cette exigence.
Réponses:
MATL , 3 octets
Essayez-le en ligne! Ou estimez les probabilités résultantes en l'exécutant 10000 fois.
Explication
la source
En fait , 4 octets
Essayez-le en ligne!
Explication:
la source
R, 10 octets
Assez simple.
la source
runif
ne renvoie jamais 0 ou 1 dans le cas par défaut , il n'y a donc aucun problème avec cela.runif
donner 1 est nulle, la probabilité de1/runif
donner 1 ne l'est pas, en raison de la précision en virgule flottante ( c'est-à-dire généralement 1 / 0,9999999 renvoie 1 dans R).TI-Basic, 2 octets
Pour tous ceux qui se demandent,
rand
renvoie une valeur aléatoire dans (0,1]. "En raison des spécificités de l'algorithme de génération de nombres aléatoires, le plus petit nombre possible à générer est légèrement supérieur à 0. Le plus grand nombre possible est en fait 1 ... "( source ). Par exemple, ensemencer le rand avec 196164532 donne 1.la source
rand
plus utile comme sous-programme pour les autres commandes de la calculatrice, c'est probablement pourquoi TI a pris cette décision de conception. Par exemple,randNorm(0,1
renvoie-7.02129...
avec la valeur de départ 196164532. L'utilisation de l'algorithme RNG sans l'ajustement donnerait une valeur de1e99
, qui est une valeur déraisonnable pour une variable normalement distribuée.R , 12 octets
Essayez-le en ligne!
Vérifier la distribution
Cela prend une approche différente, exploitant le fait que si
Y~exp(alpha)
, alorsX=x_m*e^Y
c'est un Pareto avec des paramètresx_m,alpha
. Étant donné que les deux paramètres sont 1 et que le paramètre de taux par défautrexp
est 1, cela donne la distribution de Pareto appropriée.Bien que cette réponse soit une approche assez spécifique à R, elle est malheureusement moins golfique que celle de plannapus .
R , 14 octets
Essayez-le en ligne!
Encore moins golfique, mais une autre façon d'arriver à la réponse.
Une autre propriété de la distribution exponentielle est que si
X ~ Exp(λ) then e^−X ~ Beta(λ, 1)
, d'où1/Beta(1,1)
est aPareto(1,1)
.De plus, un observateur avisé se rappellerait que si
X ~ Beta(a,b)
eta=b=1
alorsX~Unif(0,1)
, il en est vraiment ainsi1/runif(1)
.la source
actuar::rpareto(1,1,1)
Fusain , 10 octets
Essayez-le en ligne!
Lien vers la version détaillée:
Commentaires:
1/(1-R)
formule: dans ce cas, N est défini sur 1000000 car l'OP le demande comme étant le minimum. Pour obtenir ce nombre, le charbon de bois fournit une variable prédéfinief
= 1000. Il suffit donc de calculerf^2
nous obtenons 1000000. Dans le cas où le nombre aléatoire est 999999 (le maximum),1/(1-0.999999)=1000000
.1/(1-R/N)
oùR
est un nombre aléatoire entre 0 et N, c'est la même chose que de calculerN/(N-R)
. Mais étant donné que les entiers aléatoiresN-R
etR
ont la même probabilité de se produire, c'est la même chose que de simplement calculerN/R
(étantR
dans ce dernier cas un nombre compris entre 1 et N inclus pour éviter la division par zéro).la source
MapAssignRight
de 10 octets! travaux.Haskell ,
6156 octetsLa fonction
randomIO :: IO Float
produit des nombres aléatoires dans l'intervalle[0,1)
, donc les transformer en utilisantx -> 1/(1-x)
produira des réalisations pareto.Essayez-le en ligne!
la source
randomIO>>=print.((1::Float)/)
main=
.[0,1)
conforme à cette réponseExcel, 9 octets
Oui, Excel est (semi-) compétitif pour changer!
la source
=1/Rand(
)Mathematica, 10 octets
Essayez-le en ligne!
-4 octets de M.Stern
la source
RandomReal
génère un nombre réel dans la plage fermée[0, 1]
. Ainsi, la division par 0 est possible. Vous devrez manipuler la valeur aléatoire afin d'éliminer cette possibilité.the burden of proof should be on the person claiming to have a valid answer
- c'est votre travail de prouver qu'elle est valide, pas de demander à @Mego de fournir un cas de test invalide. De plus, comme float sont discrets, la probabilité d'obtenir 0 est non nulle.$MinMachineNumber
. Essayez ceci:Table[RandomReal[{0, $MinMachineNumber}], 100]
. Il s'avère que Mathematica est suffisamment intelligent pour abandonner les numéros de machine et passer à des nombres de précision arbitraires. LOL.Rubis,
148 octetsProgramme trivial, je ne pense pas qu'il puisse être plus court.
la source
Excel VBA, 6 octets
Fonction de fenêtre immédiate VBE anonyme qui ne prend aucune entrée et sortie dans la fenêtre immédiate VBE
la source
Python , 41 octets
Essayez-le en ligne!
L'utilisation de la fonction intégrée est en fait plus longue:
Python , 43 octets
Essayez-le en ligne!
Les deux solutions fonctionnent à la fois dans Python 2 et Python 3.
la source
print
enregistre un octet.J , 5 octets
Comment ça marche:
?0
génère une valeur aléatoire supérieure à 0 et inférieure à 1-.
soustraire de 1%
réciproqueEssayez-le en ligne!
la source
Rouge , 19 octets
Essayez-le en ligne!
la source
APL (Dyalog) , 5 octets
Essayez-le en ligne!
Comment?
la source
Japt , 6 octets
1/1-Mr
est la même longueur mais cela semblait un peu moins ennuyeux!Essayez-le
Explication
Incrémentez (
°
) zéro (T
) et divisez par (/
) sa différence absolue (a
) avecMath.random()
.la source
Gelée , 5 octets
Jelly n'a pas non plus de flottant aléatoire, donc cela utilise
x/n
oùx
est un entier aléatoire dans la plage[1, n]
(inclus) pour émuler un flottant aléatoire dans la plage(0, 1]
. Dans ce programmen
est réglé pour être .108
Essayez-le en ligne!
Explication
Inscrire , 3 octets
Essayez-le en ligne!
Enlist bat Jelly! (TI-Basic pas encore)
Explication
Bien sûr, cela a une probabilité non nulle de prendre l'inverse de 0.
la source
ØX
retournée0
? (Avertissement: Je ne sais pas du tout enrôler!)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
(d'après les règles du défi)Formule IBM / Lotus Notes, 13 octets
Échantillon (10 séries)
la source
Java 8,
2218 octets(Ancienne réponse avant que les règles ont changé:
v->1/(1-Math.random())
)Essayez-le ici.
la source
JavaScript REPL, 15
19octetsla source
Math.random()
renvoie 01/(1-Math.random())
?_=>
au début pour en faire une fonction; les extraits ne sont pas autorisés.Pyt , 2 octets
Explication:
Essayez-le en ligne!
la source
J, 9 octets
Je ne pouvais pas comprendre comment le faire ne prendre aucune entrée, car p =:%? 0 serait évalué immédiatement et resterait fixe. Pour cette raison, c'est un peu long.
Comment ça marche:
Évalué 20 fois:
la source
Pyth , 4 octets
Essayez-le ici!
Alternative:
c1h_O0
.la source
c1tOZ
est 5, ça ne marche pas?1-n
pas besoinn-1
100
?100
AFAIKNettoyer , 91 octets
Clean n'aime pas les nombres aléatoires.
Parce que le générateur aléatoire (un Mersenne Twister) a besoin recevoir une valeur de départ, je dois prendre l'horodatage du système pour obtenir quelque chose qui diffère passivement par exécution, et pour faire tout ce qui concerne les E / S, je dois utiliser une
Start
déclaration entière car c'est la seul endroit pour obtenir unWorld
.Essayez-le en ligne!
la source