Die Pareto-Verteilung ist eine Wahrscheinlichkeitsverteilung, die in der Natur häufig vorkommt. Es hat viele spezielle Eigenschaften, wie zum Beispiel einen unendlichen Mittelwert. In dieser Challenge geben Sie eine von dieser Distribution abgetastete Zahl aus.
Die Pareto-Verteilung ist so definiert, dass sie x
mit einer Wahrscheinlichkeit größer oder gleich ist 1/x
, für alle x
größer oder gleich 1.
Daher ist eine aus dieser Verteilung abgetastete Zahl größer als oder gleich 1 mit einer Wahrscheinlichkeit von 1, größer als oder gleich 2 mit einer Wahrscheinlichkeit von genau 1/2, größer als oder gleich 3 mit einer Wahrscheinlichkeit von genau 1/3, größer als oder gleich 11,4 mit einer Wahrscheinlichkeit von genau 1 / 11,4 und so weiter.
Da Sie diese Distribution als Beispiel verwenden, nimmt Ihr Programm oder Ihre Funktion keine Eingabe vor und gibt eine Zufallszahl mit den oben genannten Wahrscheinlichkeiten aus. Wenn Ihr Programm jedoch aufgrund der Gleitkomma-Impression die oben genannten Wahrscheinlichkeiten nicht perfekt erfüllt, ist dies in Ordnung. Weitere Informationen finden Sie am Ende der Herausforderung.
(Dies wird als Pareto-Verteilung mit Alpha 1 und Untergrenze 1 bezeichnet, um genau zu sein.)
Hier sind 10 Beispiele aus dieser Distribution:
1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156
Beachten Sie, dass 5 unter 2 und 5 über 2 liegen. Da dies das durchschnittliche Ergebnis ist, könnte es natürlich höher oder niedriger sein.
Ihre Antwort muss nur bis zu den Grenzen Ihres Gleitkommatyps, reellen Zahlentyps oder was auch immer Sie sonst verwenden, korrekt sein, aber Sie müssen in der Lage sein, Zahlen mit einer Genauigkeit von mindestens 3 Dezimalstellen und Zahlen bis zu 1.000.000 darzustellen . Wenn Sie sich nicht sicher sind, ob etwas in Ordnung ist, fragen Sie einfach.
Das ist Code Golf.
Details zur Ungenauigkeit:
Für jeden Bereich
[a, b]
ist1 <= a < b
die ideale Wahrscheinlichkeit, dass die Stichprobe in diesen Bereich fällt1/a - 1/b
,. Die Wahrscheinlichkeit, dass Ihr Programm eine Zahl in diesem Bereich erzeugt, muss bei0.001
von liegen1/a - 1/b
. WennX
die Ausgabe Ihres Programms ist, ist es erforderlich, dass|P(a <= X <= b) - (1/a - 1/b)| < 0.001
.Beachten Sie, dass Ihr Programm bei Anwendung der obigen Regel mit
a=1
undb
ausreichend groß eine Zahl größer oder gleich 1 mit einer Wahrscheinlichkeit von mindestens 0,999 ausgeben muss. In der restlichen Zeit kann es zu Abstürzen, AusgabenInfinity
oder anderen Aktionen kommen.
Ich bin mir ziemlich sicher, dass die vorhandenen Einreichungen des Formulars 1/1-x
oder 1/x
, wo x
ein Zufall in [0, 1)
oder (0, 1)
oder schwebt [0, 1]
, alle diese Anforderung erfüllen.
Antworten:
MATL , 3 Bytes
Probieren Sie es online! Oder schätzen Sie die daraus resultierenden Wahrscheinlichkeiten, indem Sie sie 10000-mal ausführen.
Erläuterung
quelle
Eigentlich 4 Bytes
Probieren Sie es online!
Erläuterung:
quelle
R, 10 Bytes
Ziemlich einfach.
quelle
runif
im Standardfall niemals 0 oder 1 zurückgegeben wird, sodass dies keine Probleme verursacht.runif
, 11/runif
zu geben, null ist, die Wahrscheinlichkeit , 1 zu geben, aufgrund der Fließkommazahlen nicht ( dh typisch 1 / 0.9999999 ergibt 1 in R).TI-Basic, 2 Bytes
Für jeden, der sich wundert, wird
rand
ein Zufallswert in (0,1] zurückgegeben. "Aufgrund der Besonderheiten des Algorithmus zur Erzeugung von Zufallszahlen ist die kleinstmögliche Zahl etwas größer als 0. Die größtmögliche Zahl ist tatsächlich 1 ... "( Quelle ). Zum Beispiel ergibt Seeding Rand mit 196164532 1.quelle
rand
als Unterroutine für die anderen Befehle des Taschenrechners nützlicher. Dies ist wahrscheinlich der Grund, warum TI diese Entwurfsentscheidung getroffen hat. BeispielsweiserandNorm(0,1
kehrt-7.02129...
mit Saatgut 196164532. Verwenden des RNG - Algorithmus ohne die Einstellung würde einen Wert geben1e99
, der ein unvernünftiger Wert für einen normal verteilter Variablen zu haben , ist.R , 12 Bytes
Probieren Sie es online!
Überprüfen Sie die Verteilung
Dies geschieht auf andere Weise, indem die Tatsache ausgenutzt wird , dass if
Y~exp(alpha)
dannX=x_m*e^Y
ein Pareto mit Parametern istx_m,alpha
. Da beide Parameter 1 sind und der Standardratenparameter fürrexp
1 ist, ergibt sich die entsprechende Pareto-Verteilung.Während diese Antwort ein ziemlich R-spezifischer Ansatz ist, ist sie leider weniger golfen als die von Plannapus .
R , 14 Bytes
Probieren Sie es online!
Noch weniger Golf, aber eine andere Möglichkeit, die Antwort zu finden.
Eine weitere Eigenschaft der Exponentialverteilung ist, dass wenn
X ~ Exp(λ) then e^−X ~ Beta(λ, 1)
, also a1/Beta(1,1)
istPareto(1,1)
.Zusätzlich würde ein scharfer Beobachter daran erinnern , dass , wenn
X ~ Beta(a,b)
unda=b=1
, dannX~Unif(0,1)
, so wirklich das ist1/runif(1)
.quelle
actuar::rpareto(1,1,1)
weil es länger ist :)Kohle , 10 Bytes
Probieren Sie es online!
Link zur ausführlichen Version:
Bemerkungen:
1/(1-R)
Formel verwendete: In diesem Fall wird N auf 1000000 gesetzt, da das OP dies als Minimum anfordert. Um diese Zahl zu erhalten, liefert Charcoal eine voreingestellte Variablef
= 1000.f^2
Wenn wir nur rechnen, erhalten wir 1000000. Für den Fall, dass die Zufallszahl 999999 (das Maximum) ist1/(1-0.999999)=1000000
.1/(1-R/N)
woR
eine Zufallszahl zwischen 0 und N ist, ist es dasselbe wie nur berechnenN/(N-R)
. Aber wenn man bedenkt, dass die ZufallszahlenN-R
undR
die Wahrscheinlichkeit des Auftretens gleich sind, dann ist das das Gleiche wie beim BerechnenN/R
(R
in diesem letzten Fall eine Zahl zwischen 1 und einschließlich N, um eine Division durch Null zu vermeiden).quelle
MapAssignRight
mehr, 10 Byte! funktioniert.Haskell ,
6156 BytesDie Funktion
randomIO :: IO Float
erzeugt Zufallszahlen in dem Intervall[0,1)
, so dass eine Transformation unter Verwendungx -> 1/(1-x)
von Pareto-Realisierungen erzeugt.Probieren Sie es online!
quelle
randomIO>>=print.((1::Float)/)
main=
.[0,1)
anhand dieser AntwortExcel, 9 Bytes
Ja, Excel ist zur Abwechslung (halb-) wettbewerbsfähig!
quelle
=1/Rand(
) ändernMathematica, 10 Bytes
Probieren Sie es online!
-4 Bytes von M.Stern
quelle
RandomReal
eine reelle Zahl im geschlossenen Bereich ausgegeben wird[0, 1]
. Somit ist eine Division durch 0 möglich. Sie müssen den Zufallswert manipulieren, um diese Möglichkeit auszuschließen.the burden of proof should be on the person claiming to have a valid answer
es Ihre Aufgabe, zu beweisen, dass es gültig ist, und @Mego nicht zu bitten, einen ungültigen Testfall bereitzustellen. Auch weil float diskret ist, ist die Wahrscheinlichkeit, 0 zu erhalten, ungleich Null.$MinMachineNumber
. Versuchen Sie folgendes:Table[RandomReal[{0, $MinMachineNumber}], 100]
. Es stellt sich heraus, dass Mathematica klug genug ist, Maschinennummern aufzugeben und auf Zahlen mit willkürlicher Genauigkeit umzuschalten. LOL.Ruby,
148 BytesTriviales Programm, ich glaube nicht, dass es kürzer werden kann.
quelle
Excel VBA, 6 Bytes
Anonyme VBE-Direktfensterfunktion, die keine Ein- und Ausgaben für das VBE-Direktfenster vornimmt
quelle
Python , 41 Bytes
Probieren Sie es online!
Die Verwendung des eingebauten ist tatsächlich länger:
Python , 43 Bytes
Probieren Sie es online!
Beide Lösungen funktionieren sowohl in Python 2 als auch in Python 3.
quelle
print
speichern ein Byte.J , 5 Bytes
Wie geht das?
?0
generiert einen Zufallswert größer als 0 und kleiner als 1-.
subtrahieren von 1%
wechselseitigProbieren Sie es online!
quelle
Rot , 19 Bytes
Probieren Sie es online!
quelle
APL (Dyalog) , 5 Bytes
Probieren Sie es online!
Wie?
quelle
Japt , 6 Bytes
1/1-Mr
ist gleich lang aber das fühlte sich etwas weniger langweilig an!Versuch es
Erläuterung
Inkrementiere (
°
) Null (T
) und dividiere durch (/
) seine absolute Differenz (a
) mitMath.random()
.quelle
Gelee , 5 Bytes
Jelly hat auch kein zufälliges Float, daher wird
x/n
hierx
eine zufällige ganze Zahl im Bereich[1, n]
(einschließlich) verwendet, um ein zufälliges Float im Bereich zu emulieren(0, 1]
. In diesem Programmn
ist festgelegt zu sein .108
Probieren Sie es online!
Erläuterung
Tragen Sie 3 Bytes ein
Probieren Sie es online!
Tragen Sie Beats Jelly ein! (TI-Basic noch nicht)
Erläuterung
Natürlich hat dies eine Wahrscheinlichkeit ungleich Null, die Umkehrung von 0 zu nehmen.
quelle
ØX
zurückgegeben0
? (Haftungsausschluss: Ich weiß gar nicht, ob ich mich einschreiben soll!)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
(von den Herausforderungsregeln)IBM / Lotus Notes-Formel, 13 Byte
Probe (10 Läufe)
quelle
Java 8,
2218 Bytes(Alte Antwort , bevor die Regeln geändert:
v->1/(1-Math.random())
)Probieren Sie es hier aus.
quelle
JavaScript REPL, 15 bis
19Bytesquelle
Math.random()
01/(1-Math.random())
?_=>
zu Beginn dies zu einer Funktion machen; Schnipsel sind nicht erlaubt.Pyt , 2 Bytes
Erläuterung:
Probieren Sie es online!
quelle
J, 9 Bytes
Ich konnte nicht herausfinden, wie ich dafür sorgen soll, dass keine Eingabe erfolgt, da p =:%? 0 sofort ausgewertet wird und fest bleibt. Aus diesem Grund ist es ziemlich lang.
Wie es funktioniert:
20 mal bewertet:
quelle
Pyth , 4 Bytes
Probieren Sie es hier aus!
Alternative:
c1h_O0
.quelle
c1tOZ
ist 5, geht das nicht?1-n
nichtn-1
100
?100
AFAIKSauber , 91 Bytes
Clean mag keine Zufallszahlen.
Da der Zufallsgenerator (a Mersenne Twister) muss ein Samen gegeben werden, ich habe die Systemzeit zu nehmen , etwas zu bekommen , dass unterscheidet sich passiv pro-Lauf, und alles zu tun , IO-bezogene ich braucht ein Ganzes zu verwenden
Start
Erklärung , weil es das ist nur ort zu erhalten aWorld
.Probieren Sie es online!
quelle