Beispiel für die Pareto-Verteilung


22

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 xmit einer Wahrscheinlichkeit größer oder gleich ist 1/x, für alle xgröß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]ist 1 <= a < bdie ideale Wahrscheinlichkeit, dass die Stichprobe in diesen Bereich fällt 1/a - 1/b,. Die Wahrscheinlichkeit, dass Ihr Programm eine Zahl in diesem Bereich erzeugt, muss bei 0.001von liegen 1/a - 1/b. Wenn Xdie 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=1und bausreichend 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, Ausgaben Infinityoder anderen Aktionen kommen.

Ich bin mir ziemlich sicher, dass die vorhandenen Einreichungen des Formulars 1/1-xoder 1/x, wo xein Zufall in [0, 1)oder (0, 1)oder schwebt [0, 1], alle diese Anforderung erfüllen.



2
Hinweis für alle: issacg hat einige Regeln hinzugefügt, die einige Ungenauigkeiten zulassen. Daher sind die meisten Antworten hier länger als nötig. [Entschuldigen Sie auch den Missbrauch von Kommentaren, aber
genau

Antworten:




5

R, 10 Bytes

1/runif(1)

Ziemlich einfach.


2
Beachten Sie, dass runif im Standardfall niemals 0 oder 1 zurückgegeben wird, sodass dies keine Probleme verursacht.
Giuseppe

Ja dank. Und ich habe bei der Eingabe dieser Antwort nicht daran gedacht, aber Sie können die Verteilung bei Bedarf überprüfen .
Plannapus

2
@Mego das ist falsch. Die Pareto-Verteilung ist absolut stetig und hat daher für jede Zahl den Wert 0.
Therkel

3
@Mego OK, das mag für mich Treibsand sein (vorausgesetzt, ich weiß so gut wie nichts über Fließkommazahlen), aber ich denke tatsächlich, dass die Wahrscheinlichkeit runif, 1 1/runifzu geben, null ist, die Wahrscheinlichkeit , 1 zu geben, aufgrund der Fließkommazahlen nicht ( dh typisch 1 / 0.9999999 ergibt 1 in R).
Plannapus

1
@plannapus Hmm ... Das ist ein guter Punkt. Schwimmer machen das völlig zu kompliziert.
Mego

4

TI-Basic, 2 Bytes

rand^-1      (AB 0C in hex)

Für jeden, der sich wundert, wird randein 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.


Seltsamerweise würde der entsprechende Code auf einem Taschenrechner der TI-89-Serie nicht funktionieren. Obwohl ihre Zufallszahlengeneratoren nahezu identisch implementiert sind, gibt ein TI-89 immer dann 0 zurück, wenn ein TI-83 + 0,99999999999889 zurückgibt.
Mischa Lawrow

2
TI-Basic-Entwickler wussten im Voraus, dass diese Herausforderung eintreten wird ...? Diesmal scheint es zu gewinnen.
user202729

@ user202729 Das Vermeiden von 0 und 1 ist randals Unterroutine für die anderen Befehle des Taschenrechners nützlicher. Dies ist wahrscheinlich der Grund, warum TI diese Entwurfsentscheidung getroffen hat. Beispielsweise randNorm(0,1kehrt -7.02129...mit Saatgut 196164532. Verwenden des RNG - Algorithmus ohne die Einstellung würde einen Wert geben 1e99, der ein unvernünftiger Wert für einen normal verteilter Variablen zu haben , ist.
Mischa Lawrow

@ user202729 Ja, eigentlich bin ich gerade ein bisschen gereist, um alles zu erledigen. Es lohnt sich auf jeden Fall für diese Upvotes.
Timtech

4

R , 12 Bytes

exp(rexp(1))

Probieren Sie es online!

Überprüfen Sie die Verteilung

Dies geschieht auf andere Weise, indem die Tatsache ausgenutzt wird , dass if Y~exp(alpha)dann X=x_m*e^Yein Pareto mit Parametern ist x_m,alpha. Da beide Parameter 1 sind und der Standardratenparameter für rexp1 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

1/rbeta(1,1,1)

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 a 1/Beta(1,1)ist Pareto(1,1).

Zusätzlich würde ein scharfer Beobachter daran erinnern , dass , wenn X ~ Beta(a,b)und a=b=1, dann X~Unif(0,1), so wirklich das ist 1/runif(1).


Ich habe keine Ahnung. In Wirklichkeit herrscht jedoch große Verwirrung darüber, was bei dieser Herausforderung erlaubt ist und was nicht.
user202729

@ user202729 das ist fair, aber diejenigen, die diesbezüglich Bedenken geäußert haben, hätten dies zumindest kommentiert, so dass es (meiner Meinung nach) unwahrscheinlich ist, dass die Ablehnung damit zusammenhängt. BEARBEITEN: Mystery Downvoter hat die Downvote entfernt.
Giuseppe

Ich habe abgelehnt, weil ich dachte, dass die Verwendung von R bei einer solchen Herausforderung trivial ist, aber ich war ein wenig triggerglücklich. Mir ist klar, dass dies eine andere Methode verwendet als die meisten anderen Antworten, daher habe ich meine Ablehnung entfernt.
KSmarts

@KSmarts Die "triviale" Antwort in R wurde eigentlich von niemandem benutzt: actuar::rpareto(1,1,1)weil es länger ist :)
Plannapus

Für Infos gibt es ca. Da 20 Distributionen in Basis R fest codiert sind, Pareto jedoch nicht dazu gehört, muss entweder ein Workaround oder ein zusätzliches Paket verwendet werden.
Plannapus

3

Kohle , 10 Bytes

I∕Xφ²⊕‽Xφ²

Probieren Sie es online!

Link zur ausführlichen Version:

Print(Cast(Divide(Power(f, 2), ++(Random(Power(f, 2))))));

Bemerkungen:

  • Charcoal hat nur Methoden, um zufällige Ganzzahlen zu erhalten. Um also eine zufällige Gleitkommazahl zwischen 0 und 1 zu erhalten, müssen wir eine zufällige Ganzzahl zwischen 0 und N erhalten und durch N dividieren.
  • Vorherige Version dieser Antwort, die die 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 Variable f= 1000. f^2Wenn wir nur rechnen, erhalten wir 1000000. Für den Fall, dass die Zufallszahl 999999 (das Maximum) ist 1/(1-0.999999)=1000000.
  • Neils Tipp (3 Bytes sparen): Wenn ich habe, 1/(1-R/N)wo Reine Zufallszahl zwischen 0 und N ist, ist es dasselbe wie nur berechnen N/(N-R). Aber wenn man bedenkt, dass die Zufallszahlen N-Rund Rdie Wahrscheinlichkeit des Auftretens gleich sind, dann ist das das Gleiche wie beim Berechnen N/R( Rin diesem letzten Fall eine Zahl zwischen 1 und einschließlich N, um eine Division durch Null zu vermeiden).


@Neil bitte einen Moment warten, während ich versuche zu verstehen, was Ihr Code tut ... :-)
Charlie

Eigentlich brauche ich nicht MapAssignRightmehr, 10 Byte! funktioniert.
Neil

@Neil Assimilation Ihres Codes abgeschlossen! Antwort bearbeitet. :-D
Charlie

3

Haskell , 61 56 Bytes

Die Funktion randomIO :: IO Floaterzeugt Zufallszahlen in dem Intervall [0,1) , so dass eine Transformation unter Verwendung x -> 1/(1-x)von Pareto-Realisierungen erzeugt.

import System.Random
randomIO>>=print.(1/).((1::Float)-)

Probieren Sie es online!


Durch das Verschieben der randomIO>>=print.((1::Float)/)
Typanmerkung werden

Und da Funktionen erlaubt sind, würde ich sagen, dass Sie die fallen lassen können main=.
Laikoni

Appranetly der Bereich [0,1)anhand dieser Antwort
flawr

@flawr Ups, du hast recht! Ich habe vergessen, wie Schwimmer vorübergehend funktionieren.
Mego

Na ja, danke für den Kommentar, ich hätte keine Ahnung
gehabt

3

Excel, 9 Bytes

=1/rand()

Ja, Excel ist zur Abwechslung (halb-) wettbewerbsfähig!


Funktioniert auch in LibreOffice Calc :)
ElPedro

Sie können dies in Google Sheets für -1 Bytes ( =1/Rand() ändern
Taylor Scott

3

Mathematica, 10 Bytes

1/Random[]

Probieren Sie es online!

-4 Bytes von M.Stern


2
Dies kann fehlschlagen, da RandomRealeine 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.
Mego

2
@Mego wo genau hast du die infos gefunden?
J42161217

1
@Mego was ist die Wahrscheinlichkeit, 0 zu bekommen?
J42161217

4
Jenny_mathy: Gemäß dem Meta- Vorschlag ist the burden of proof should be on the person claiming to have a valid answeres 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.
user202729

1
Zurück zum Thema, ich glaube nicht, dass es eine Möglichkeit gibt, mit dieser Funktion eine Null zu bekommen. Mathematica wird in der Tat weniger als Zahlen produzieren $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.
Kelly Lowder

2

Ruby, 14 8 Bytes

p 1/rand

Triviales Programm, ich glaube nicht, dass es kürzer werden kann.


Hinweis für alle: issacg hat einige Regeln hinzugefügt, die einige Ungenauigkeiten zulassen. Daher sind die meisten Antworten hier länger als nötig.
user202729

2

Excel VBA, 6 Bytes

Anonyme VBE-Direktfensterfunktion, die keine Ein- und Ausgaben für das VBE-Direktfenster vornimmt

?1/Rnd


1

J , 5 Bytes

%-.?0

Wie geht das?

?0 generiert einen Zufallswert größer als 0 und kleiner als 1

-. subtrahieren von 1

% wechselseitig

Probieren Sie es online!


Hinweis für alle: issacg hat einige Regeln hinzugefügt, die einige Ungenauigkeiten zulassen. Daher sind die meisten Antworten hier länger als nötig.
user202729



1

Japt , 6 Bytes

1/1-Mr ist gleich lang aber das fühlte sich etwas weniger langweilig an!

°T/aMr

Versuch es


Erläuterung

Inkrementiere ( °) Null ( T) und dividiere durch ( /) seine absolute Differenz ( a) mit Math.random().


Hinweis für alle: issacg hat einige Regeln hinzugefügt, die einige Ungenauigkeiten zulassen. Daher sind die meisten Antworten hier länger als nötig.
user202729

1

Gelee , 5 Bytes

Jelly hat auch kein zufälliges Float, daher wird x/nhier xeine zufällige ganze Zahl im Bereich [1, n](einschließlich) verwendet, um ein zufälliges Float im Bereich zu emulieren (0, 1]. In diesem Programm nist festgelegt zu sein .108

ȷ8µ÷X

Probieren Sie es online!

Erläuterung

ȷ8     Literal 10^8.
  µ    New monad.
   ÷   Divide by
    X  random integer.

Tragen Sie 3 Bytes ein

ØXİ

Probieren Sie es online!

Tragen Sie Beats Jelly ein! (TI-Basic noch nicht)

Erläuterung

  İ    The inverse of...
ØX     a random float in [0, 1)

Natürlich hat dies eine Wahrscheinlichkeit ungleich Null, die Umkehrung von 0 zu nehmen.


Würde die Enlist Lösung nicht , wenn nicht ØXzurückgegeben 0? (Haftungsausschluss: Ich weiß gar nicht, ob ich mich einschreiben soll!)
Shaggy

@ Shaggy 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)
user202729

1

IBM / Lotus Notes-Formel, 13 Byte

1/(1-@Random)

Probe (10 Läufe)

Bildbeschreibung hier eingeben


Hinweis für alle: issacg hat einige Regeln hinzugefügt, die einige Ungenauigkeiten zulassen. Daher sind die meisten Antworten hier länger als nötig.
user202729

Ich bin mir nicht sicher, ob ich das viel kürzer machen könnte, egal welche Regeländerungen vorgenommen werden :)
ElPedro


1

JavaScript REPL, 15 bis 19 Bytes

1/Math.random()

3
Dies wird keine korrekten Ergebnisse liefern, wenn Math.random() 0
Mr. Xcoder

1
Wahrscheinlich 1/(1-Math.random())?
user202729


Sie müssen _=>zu Beginn dies zu einer Funktion machen; Schnipsel sind nicht erlaubt.
Shaggy

Es ist ein volles Programm mit laufender Konsole
l4m2


0

J, 9 Bytes

p=:%@?@0:

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:

p=:        | Define the verb p
       0:  | Constant function. Returns 0 regardless of input.
     ?@    | When applied to 0, returns a random float in the range (0,1)
   %@      | Reciprocal

20 mal bewertet:

    p"0 i.20
1.27056 1.86233 1.05387 16.8991 5.77882 3.42535 12.8681 17.4852 2.09133 1.82233 2.28139 1.58133 1.79701 1.09794 1.18695 1.07028 3.38721 2.88339 2.06632 2.0793


0

Sauber , 91 Bytes

import StdEnv,Math.Random,System.Time
Start w=1.0/(1.0-hd(genRandReal(toInt(fst(time w)))))

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 StartErklärung , weil es das ist nur ort zu erhalten a World.

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.