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 x
z prawdopodobieństwem 1/x
, dla wszystkich x
wię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]
, gdzie1 <= a < b
jest idealne prawdopodobieństwo, że próbka spadnie w tym zakresie1/a - 1/b
. Prawdopodobieństwo, że program produkuje wiele w tym zakresie musi być z0.001
o1/a - 1/b
. JeśliX
jest 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=1
ib
odpowiednio 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ścieInfinity
lub cokolwiek innego.
Jestem całkiem pewien, że istniejące formularze 1/1-x
lub 1/x
, gdzie x
jest losowy zmiennoprzecinkowy w [0, 1)
lub (0, 1)
lub [0, 1]
, wszystkie spełniają ten wymóg.
Odpowiedzi:
MATL , 3 bajty
Wypróbuj online! Lub oszacuj wynikające z tego prawdopodobieństwa , uruchamiając je 10000 razy.
Wyjaśnienie
źródło
Właściwie 4 bajty
Wypróbuj online!
Wyjaśnienie:
źródło
R, 10 bajtów
Całkiem proste.
źródło
runif
nigdy nie zwraca 0 lub 1 w przypadku domyślnym, więc nie ma z tym problemów.runif
podania 1 jest zerowe, prawdopodobieństwo1/runif
podania 1 nie jest, ze względu na dokładność zmiennoprzecinkową ( tzn. zazwyczaj 1 / 0,9999999 zwraca 1 w R).TI-Basic, 2 bajty
Dla każdego, kto się zastanawia,
rand
zwraca 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.źródło
rand
bardziej przydatne jako podprogram dla innych poleceń kalkulatora i prawdopodobnie dlatego TI podjęło tę decyzję projektową. Na przykładrandNorm(0,1
zwraca 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.R , 12 bajtów
Wypróbuj online!
Sprawdź dystrybucję
Przybiera to inne podejście, wykorzystując fakt, że jeśli
Y~exp(alpha)
,X=x_m*e^Y
to Pareto z parametramix_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
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ąd1/Beta(1,1)
jest toPareto(1,1)
.Ponadto, bystry obserwator przypomniałby sobie, że jeśli
X ~ Beta(a,b)
ia=b=1
wtedyX~Unif(0,1)
, więc to naprawdę jest1/runif(1)
.źródło
actuar::rpareto(1,1,1)
Węgiel drzewny , 10 bajtów
Wypróbuj online!
Link jest do pełnej wersji:
Komentarze:
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ącf^2
, otrzymujemy 1000000. W przypadku, gdy liczba losowa wynosi 999999 (maksymalna),1/(1-0.999999)=1000000
.1/(1-R/N)
gdzieR
jest losowa liczba od 0 do N, jest to to samo, co po prostu obliczN/(N-R)
. Ale biorąc pod uwagę, że losowe liczby całkowiteN-R
iR
mają takie samo prawdopodobieństwo ich pojawienia się, że jest taka sama jak tylko obliczeniaN/R
(będącR
w tym ostatnim przypadku liczba pomiędzy 1 i N włącznie do podziału unikaj przez zero).źródło
MapAssignRight
więcej, 10 bajtów! Prace.Haskell ,
6156 bajtówTa funkcja
randomIO :: IO Float
generuje losowe liczby w przedziale[0,1)
, więc ich przekształcenie za pomocąx -> 1/(1-x)
spowoduje wygenerowanie realizacji pareto.Wypróbuj online!
źródło
randomIO>>=print.((1::Float)/)
main=
.[0,1)
zgodny z tą odpowiedziąExcel, 9 bajtów
Tak, Excel jest (częściowo) konkurencyjny o zmianę!
źródło
=1/Rand(
)Mathematica, 10 bajtów
Wypróbuj online!
-4 bajty od M.Stern
źródło
RandomReal
generuje 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ść.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.$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.Rubin,
148 bajtówTrywialny program, nie sądzę, że może być krótszy.
źródło
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
źródło
Python , 41 bajtów
Wypróbuj online!
Korzystanie z wbudowanego jest faktycznie dłuższe:
Python , 43 bajty
Wypróbuj online!
Oba rozwiązania działają zarówno w Python 2, jak i Python 3.
źródło
print
zapisuje bajt.J , 5 bajtów
Jak działa ot:
?0
generuje losową wartość większą niż 0 i mniejszą niż 1-.
odejmij od 1%
odwrotnośćWypróbuj online!
źródło
Czerwony , 19 bajtów
Wypróbuj online!
źródło
APL (Dyalog), 5 bytes
Try it online!
How?
źródło
Japt, 6 bytes
1/1-Mr
is the same length but this felt a little less boring!Try it
Explanation
Increment (
°
) zero (T
) and divide by (/
) its absolute difference (a
) withMath.random()
.źródło
Jelly, 5 bytes
Jelly also doesn't have random float, so this uses
x/n
wherex
is an random integer in range[1, n]
(inclusive) to emulate a random float in range(0, 1]
. In this programn
is set to be108
.Try it online!
Explanation
Enlist, 3 bytes
Try it online!
Enlist beats Jelly! (TI-Basic not yet)
Explanation
Of course this has nonzero probability of take the inverse of 0.
źródło
ØX
returned0
? (Disclaimer: I don't know Enlist at all!)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)IBM/Lotus Notes Formula, 13 bytes
Sample (10 runs)
źródło
Java 8,
2218 bytes(Old answer before the rules changed:
v->1/(1-Math.random())
)Try it here.
źródło
JavaScript REPL, 15
19bytesźródło
Math.random()
returns 01/(1-Math.random())
?_=>
at the start to make this a function; snippets aren't allowed.Pyt, 2 bytes
Explanation:
Try it online!
źródło
J, 9 Bytes
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:
Evaluated 20 times:
źródło
Pyth, 4 bytes
Try it here!
Alternative:
c1h_O0
.źródło
c1tOZ
is 5, does it not work?1-n
notn-1
100
?100
AFAIKClean, 91 bytes
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 aWorld
.Try it online!
źródło