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.

isaacg
quelle
Lassen Sie uns diese Diskussion im Chat fortsetzen .
Isaacg
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.

Plannapus
quelle
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.

Timtech
quelle
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).

Giuseppe
quelle
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).
Charlie
quelle
10 Bytes
Neil
@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!

fehlerhaft
quelle
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!

Therkel
quelle
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

J42161217
quelle
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.

GB
quelle
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
Taylor Scott
quelle
1

Python , 41 Bytes

lambda:1/(1-random())
from random import*

Probieren Sie es online!


Die Verwendung des eingebauten ist tatsächlich länger:

Python , 43 Bytes

lambda:paretovariate(1)
from random import*

Probieren Sie es online!

Beide Lösungen funktionieren sowohl in Python 2 als auch in Python 3.

Mego
quelle
1
Vollständige Programme sind für Aufgaben, die keine Eingabe verwenden, kürzer und printspeichern ein Byte.
Erik der Outgolfer
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!

Galen Ivanov
quelle
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

Rot , 19 Bytes

1 /(1 - random 1.0)

Probieren Sie es online!

Galen Ivanov
quelle
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

APL (Dyalog) , 5 Bytes

÷1-?0

Probieren Sie es online!

Wie?

 ÷   1-     ?0
1÷  (1-  random 0..1)
Uriel
quelle
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().

Zottelig
quelle
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.

user202729
quelle
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

ElPedro
quelle
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

Java 8, 22 18 Bytes

v->1/Math.random()

(Alte Antwort , bevor die Regeln geändert: v->1/(1-Math.random()))

Probieren Sie es hier aus.

Kevin Cruijssen
quelle
1

JavaScript REPL, 15 bis 19 Bytes

1/Math.random()
l4m2
quelle
3
Dies wird keine korrekten Ergebnisse liefern, wenn Math.random() 0
Mr. Xcoder
1
Wahrscheinlich 1/(1-Math.random())?
user202729
Behoben mit
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
Bolce Bussiere
quelle
0

Pyth , 4 Bytes

c1O0

Probieren Sie es hier aus!

Alternative: c1h_O0.

Mr. Xcoder
quelle
c1tOZist 5, geht das nicht?
Dave
@ Dave Funktioniert nicht, das gibt negative Werte zurück. Ich brauche 1-nnichtn-1
Mr. Xcoder
Hat Pyth keine Konstante für 100?
Shaggy
@ Shaggy Ich wünschte, es wäre so. Leider keine Konstante für 100AFAIK
Mr. Xcoder
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!

Οurous
quelle