Próbka dystrybucji Pareto


22

Rozkład Pareto jest rozkładem prawdopodobieństwa, który często pojawia się w przyrodzie. Ma wiele specjalnych właściwości, takich jak nieskończona średnia. W tym wyzwaniu wypiszesz liczbę próbkowaną z tej dystrybucji.

Dystrybucja Pareto jest zdefiniowana jako większa lub równa xz prawdopodobieństwem 1/x, dla wszystkich xwiększa lub równa 1.

Dlatego liczba próbkowana z tego rozkładu jest większa lub równa 1 z prawdopodobieństwem 1, większa lub równa 2 z prawdopodobieństwem dokładnie 1/2, większa lub równa 3 z prawdopodobieństwem dokładnie 1/3, większa lub równa 11.4 z prawdopodobieństwem dokładnie 1 / 11.4 i tak dalej.

Ponieważ próbujesz tego rozkładu, twój program lub funkcja nie będzie pobierać danych wejściowych i generować losową liczbę z powyższymi prawdopodobieństwami. Jeśli jednak twój program nie pasuje idealnie do powyższych prawdopodobieństw ze względu na wrażenie zmiennoprzecinkowe, to jest OK. Więcej szczegółów znajdziesz u dołu wyzwania.

(Mówiąc dokładniej, nazywa się to rozkładem Pareto z alfa 1 i dolną granicą 1)

Oto 10 przykładów z tej dystrybucji:

1.1540029602790338
52.86156818209856
3.003306506971116
1.4875532217142287
1.3604286212876546
57.5263129600285
1.3139866916055676
20.25125817471419
2.8105749663695208
1.1528212409680156

Zauważ, że 5 z nich jest poniżej 2, a 5 powyżej 2. Ponieważ jest to średni wynik, mógł on być oczywiście wyższy lub niższy.

Twoja odpowiedź musi być poprawna do granic typu zmiennoprzecinkowego, typu liczb rzeczywistych lub czegokolwiek innego, ale musisz być w stanie przedstawić liczby z dokładnością co najmniej 3 cyfr dziesiętnych i reprezentować liczby do 1 000 000 . Jeśli nie masz pewności, czy coś jest w porządku, zapytaj.

To jest kod golfowy.


Szczegóły dotyczące niedokładności:

  • Dla każdego zakresu [a, b], gdzie 1 <= a < bjest idealne prawdopodobieństwo, że próbka spadnie w tym zakresie 1/a - 1/b. Prawdopodobieństwo, że program produkuje wiele w tym zakresie musi być z 0.001o 1/a - 1/b. Jeśli Xjest to wynik twojego programu, jest to wymagane |P(a <= X <= b) - (1/a - 1/b)| < 0.001.

  • Zauważ, że stosując powyższą regułę a=1i bodpowiednio dużą, twój program musi wypisać liczbę większą lub równą 1 z prawdopodobieństwem co najmniej 0,999. Resztę czasu może to spowodować awarię, wyjście Infinitylub cokolwiek innego.

Jestem całkiem pewien, że istniejące formularze 1/1-xlub 1/x, gdzie xjest losowy zmiennoprzecinkowy w [0, 1)lub (0, 1)lub [0, 1], wszystkie spełniają ten wymóg.



2
Uwaga dla wszystkich: issacg dodał pewne reguły, które pozwalają na pewne niedokładności, dlatego większość odpowiedzi tutaj jest dłuższa niż to konieczne. [przepraszam za nadużycie w komentarzach też, ale to, co się stanie, gdy zmiana OP pytanie znacząco]
user202729

Odpowiedzi:




5

R, 10 bajtów

1/runif(1)

Całkiem proste.


2
Pamiętaj, że runif nigdy nie zwraca 0 lub 1 w przypadku domyślnym, więc nie ma z tym problemów.
Giuseppe,

Tak, dziękuję. I nie pomyślałem o tym, wpisując tę ​​odpowiedź, ale naprawdę możesz zweryfikować dystrybucję, jeśli to konieczne.
plannapus

2
@Mego, które jest niepoprawne. Rozkład Pareto jest absolutnie ciągły, a zatem ma miarę 0 dla dowolnej liczby.
Therkel,

3
@Mego OK, co może być dla mnie szybkim piaskiem (biorąc pod uwagę, że wiem prawie nic o zmiennoprzecinkowym), ale tak naprawdę myślę, że chociaż prawdopodobieństwo runifpodania 1 jest zerowe, prawdopodobieństwo 1/runifpodania 1 nie jest, ze względu na dokładność zmiennoprzecinkową ( tzn. zazwyczaj 1 / 0,9999999 zwraca 1 w R).
plannapus

1
@plannapus Hmm ... To dobra uwaga. Spławiki sprawiają, że jest to zbyt skomplikowane.
Mego

4

TI-Basic, 2 bajty

rand^-1      (AB 0C in hex)

Dla każdego, kto się zastanawia, randzwraca losową wartość w (0,1]. ”Ze względu na specyfikę algorytmu generowania liczb losowych najmniejsza możliwa do wygenerowania liczba jest nieco większa niż 0. Największa możliwa liczba to w rzeczywistości 1 ... „( źródło ). Na przykład zaszczepienie rand 196164532 daje 1.


O dziwo, równoważny kod nie działałby na kalkulatorze serii TI-89. Mimo że generatory liczb losowych są prawie identycznie zaimplementowane, TI-89 zwróci 0, ilekroć TI-83 + zwróci 0,99999999999889.
Misza Ławrow,

2
Programiści TI-Basic z góry wiedzieli, że to wyzwanie się wydarzy ...? Tym razem wydaje się, że wygrywa.
user202729,

@ user202729 Unikanie wartości 0 i 1 jest randbardziej przydatne jako podprogram dla innych poleceń kalkulatora i prawdopodobnie dlatego TI podjęło tę decyzję projektową. Na przykład randNorm(0,1zwraca wartość -7.02129...początkową 196164532. Zastosowanie algorytmu RNG bez korekty dałoby wartość 1e99, która jest nieuzasadnioną wartością dla zmiennej o rozkładzie normalnym.
Misza Ławrow

@ user202729 Tak, tak naprawdę podróżowałem trochę czasu, aby wszystko załatwić. Zdecydowanie warto dla tych pozytywnych opinii.
Timtech

4

R , 12 bajtów

exp(rexp(1))

Wypróbuj online!

Sprawdź dystrybucję

Przybiera to inne podejście, wykorzystując fakt, że jeśli Y~exp(alpha), X=x_m*e^Yto Pareto z parametrami x_m,alpha. Ponieważ oba parametry mają wartość 1, a parametr domyślnej stawki dlarexp jest 1, skutkuje to odpowiednim rozkładem Pareto.

Chociaż ta odpowiedź jest dość specyficzna dla R, jest niestety mniej golfowa niż plannapusa .

R , 14 bajtów

1/rbeta(1,1,1)

Wypróbuj online!

Jeszcze mniej golfowy, ale inny sposób na uzyskanie odpowiedzi.

Inną właściwością rozkładu wykładniczego jest to, że jeśli X ~ Exp(λ) then e^−X ~ Beta(λ, 1)stąd 1/Beta(1,1)jest toPareto(1,1) .

Ponadto, bystry obserwator przypomniałby sobie, że jeśli X ~ Beta(a,b)i a=b=1wtedyX~Unif(0,1) , więc to naprawdę jest 1/runif(1).


Nie mam pojęcia. Ale w rzeczywistości istnieje ogromne zamieszanie co do tego, co jest dozwolone, a co nie w tym wyzwaniu.
user202729,

@ user202729 to jest sprawiedliwe, ale ci, którzy zgłaszali obawy w tym zakresie, przynajmniej by to skomentowali, więc jest mało prawdopodobne, aby opinia negatywna była z tym związana. EDYCJA: tajemniczy downvoter usunął głos negatywny.
Giuseppe,

Przegłosowałem, ponieważ myślałem, że użycie R na takim wyzwaniu jest trywialne, ale byłem trochę szczęśliwy. Zdaję sobie sprawę, że używa to innej metody niż większość innych odpowiedzi, więc usunąłem moją opinię.
KSmarts

@KSmarts „Trywialna” odpowiedź w języku R nie była przez nikogo używana actuar::rpareto(1,1,1)
:,

Do wiadomości jest około. 20 dystrybucji zakodowanych na stałe w bazie R, ale Pareto nie jest jedną z nich, stąd potrzeba albo użycia obejścia, albo dodatkowego pakietu.
plannapus

3

Węgiel drzewny , 10 bajtów

I∕Xφ²⊕‽Xφ²

Wypróbuj online!

Link jest do pełnej wersji:

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

Komentarze:

  • Węgiel drzewny ma tylko metody uzyskiwania losowych liczb całkowitych, więc aby uzyskać losową liczbę zmiennoprzecinkową od 0 do 1, musimy uzyskać losową liczbę całkowitą od 0 do N i podzielić przez N.
  • Poprzednia wersja tej odpowiedzi, która używała 1/(1-R)formuły: W tym przypadku N jest ustawione na 1000000, ponieważ OP prosi, aby było to minimum. Aby uzyskać tę liczbę, węgiel drzewny zapewnia wstępnie ustawioną zmienną f= 1000. Po prostu obliczając f^2, otrzymujemy 1000000. W przypadku, gdy liczba losowa wynosi 999999 (maksymalna),1/(1-0.999999)=1000000 .
  • Wskazówka Neila (oszczędność 3 bajtów): Jeśli mam 1/(1-R/N)gdzie Rjest losowa liczba od 0 do N, jest to to samo, co po prostu oblicz N/(N-R). Ale biorąc pod uwagę, że losowe liczby całkowite N-Ri Rmają takie samo prawdopodobieństwo ich pojawienia się, że jest taka sama jak tylko obliczenia N/R(będąc Rw tym ostatnim przypadku liczba pomiędzy 1 i N włącznie do podziału unikaj przez zero).


@ Neil, proszę chwilę poczekać, aż spróbuję zrozumieć, co robi twój kod ... :-)
Charlie

Właściwie nie potrzebuję MapAssignRightwięcej, 10 bajtów! Prace.
Neil,

@ Asymilacja Twojego kodu zakończona! Odpowiedź edytowana. :-D
Charlie,

3

Haskell , 61 56 bajtów

Ta funkcja randomIO :: IO Floatgeneruje losowe liczby w przedziale [0,1) , więc ich przekształcenie za pomocą x -> 1/(1-x)spowoduje wygenerowanie realizacji pareto.

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

Wypróbuj online!


Przeniesienie adnotacji typu pozwala zaoszczędzić kilka bajtów:randomIO>>=print.((1::Float)/)
Laikoni

A ponieważ funkcje są dozwolone, powiedziałbym, że możesz upuścić main=.
Laikoni,

Wygląda na to, że zakres jest [0,1)zgodny z tą odpowiedzią
błąd

@flawr Ups, masz rację! Zapomniałem, jak tymczasowo działają pływaki.
Mego

Cóż, w każdym razie dzięki za komentarz, nie miałbym pojęcia :)
flawr

3

Excel, 9 bajtów

=1/rand()

Tak, Excel jest (częściowo) konkurencyjny o zmianę!


Działa również w LibreOffice Calc :)
ElPedro

Możesz to zmienić na arkusze Google dla -1 Bytes ( =1/Rand()
Taylor Scott,

3

Mathematica, 10 bajtów

1/Random[]

Wypróbuj online!

-4 bajty od M.Stern


2
Może to spowodować awarię, ponieważ RandomRealgeneruje liczbę rzeczywistą w zamkniętym zakresie [0, 1]. W ten sposób możliwy jest podział przez 0. Będziesz musiał manipulować losową wartością, aby usunąć tę możliwość.
Mego

2
@Mego, gdzie dokładnie znalazłeś te informacje?
J42161217,

1
@Mego jakie jest prawdopodobieństwo uzyskania 0?
J42161217,

4
Jenny_mathy: Zgodnie z propozycją dotyczącą meta, the burden of proof should be on the person claiming to have a valid answer- Twoim zadaniem jest udowodnienie, że jest poprawna, a nie proszenie @Mego o dostarczenie nieprawidłowego przypadku testowego. Również ponieważ zmiennoprzecinkowe są dyskretne, prawdopodobieństwo uzyskania 0 jest niezerowe.
user202729,

1
Wracając do tematu, nie wierzę, że istnieje możliwość uzyskania zera za pomocą tej funkcji. Mathematica będzie produkować liczby mniejsze niż $MinMachineNumber. Spróbuj tego: Table[RandomReal[{0, $MinMachineNumber}], 100]. Okazuje się, że Mathematica jest wystarczająco inteligentna, aby porzucić numery maszyn i przełączyć się na dowolne liczby precyzji. LOL.
Kelly Lowder,

2

Rubin, 14 8 bajtów

p 1/rand

Trywialny program, nie sądzę, że może być krótszy.


Uwaga dla wszystkich: issacg dodał pewne reguły, które pozwalają na pewne niedokładności, dlatego większość odpowiedzi tutaj jest dłuższa niż to konieczne.
user202729,

2

Excel VBA, 6 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która nie pobiera danych wejściowych i wyjściowych do bezpośredniego okna VBE

?1/Rnd

1

Python , 41 bajtów

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

Wypróbuj online!


Korzystanie z wbudowanego jest faktycznie dłuższe:

Python , 43 bajty

lambda:paretovariate(1)
from random import*

Wypróbuj online!

Oba rozwiązania działają zarówno w Python 2, jak i Python 3.


1
Pełne programy są krótsze w przypadku zadań, które nie wykorzystują danych wejściowych, ponieważ printzapisuje bajt.
Erik the Outgolfer,

1

J , 5 bajtów

%-.?0

Jak działa ot:

?0 generuje losową wartość większą niż 0 i mniejszą niż 1

-. odejmij od 1

% odwrotność

Wypróbuj online!


Uwaga dla wszystkich: issacg dodał pewne reguły, które pozwalają na pewne niedokładności, dlatego większość odpowiedzi tutaj jest dłuższa niż to konieczne.
user202729,



1

Japt, 6 bytes

1/1-Mr is the same length but this felt a little less boring!

°T/aMr

Try it


Explanation

Increment (°) zero (T) and divide by (/) its absolute difference (a) with Math.random().


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729

1

Jelly, 5 bytes

Jelly also doesn't have random float, so this uses x/n where x is an random integer in range [1, n] (inclusive) to emulate a random float in range (0, 1]. In this program n is set to be 108.

ȷ8µ÷X

Try it online!

Explanation

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

Enlist, 3 bytes

ØXİ

Try it online!

Enlist beats Jelly! (TI-Basic not yet)

Explanation

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

Of course this has nonzero probability of take the inverse of 0.


Would the Enlist solution not fail if ØX returned 0? (Disclaimer: I don't know Enlist at all!)
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 (from the challenge rules)
user202729

1

IBM/Lotus Notes Formula, 13 bytes

1/(1-@Random)

Sample (10 runs)

enter image description here


Note to everyone: issacg has added some rules that allow some imprecisions, therefore most answers here are longer than necessary.
user202729

Not sure I could make this much shorter whatever rule changes are made :)
ElPedro


1

JavaScript REPL, 15 19 bytes

1/Math.random()

3
This will not yield correct results if Math.random() returns 0
Mr. Xcoder

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

Fixed using u*29's solution
l4m2

You need _=> at the start to make this a function; snippets aren't allowed.
Shaggy

It's a full program using console running
l4m2


0

J, 9 Bytes

p=:%@?@0:

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:

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

Evaluated 20 times:

    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

Clean, 91 bytes

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

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 a World.

Try it online!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.