nie używam Python, więc zamiast błędy składniowe ryzyka postaram się opisać rozwiązanie algorytmicznie. Jest to inwersja dyskretna o charakterze brutalnej siły. Powinno to dość łatwo przetłumaczyć na język Python. Zakładam indeksowanie 0 dla tablicy.
Ustawienia:
generowanie tablicy cdf
wielkości m
z cdf[0] = 1
jako pierwszy wpis, cdf[i] = cdf[i-1] + 1/(i+1)**a
dla pozostałych pozycji.
Skaluj wszystkie wpisy, dzieląc cdf[m-1]
na każdy - teraz są to wartości CDF.
Zastosowanie:
- Generowanie losowe wartości swoich generując Uniform (0,1) i przeszukiwaniu
cdf[]
aż znajdziesz wpis większa niż jednolite . Zwróć indeks + 1 jako swoją wartość x
.
Powtórz czynność dla dowolnej liczby x
-wartości.
Na przykład, z a,m = 2,10
, obliczyć prawdopodobieństwo bezpośrednio jako:
[0.6452579827864142, 0.16131449569660355, 0.07169533142071269, 0.04032862392415089, 0.02581031931145657, 0.017923832855178172, 0.013168530260947229, 0.010082155981037722, 0.007966147935634743, 0.006452579827864143]
i CDF jest:
[0.6452579827864142, 0.8065724784830177, 0.8782678099037304, 0.9185964338278814, 0.944406753139338, 0.9623305859945162, 0.9754991162554634, 0.985581272236501, 0.9935474201721358, 1.0]
Podczas generowania, jeżeli mam Uniform wynik 0,90 wrócę x=4
ponieważ 0.918 ... to pierwszy wpis w pliku CDF większy niż mój jednolity.
Jeśli martwisz się szybkością, możesz zbudować tablicę aliasów, ale z rozkładem geometrycznym prawdopodobieństwo wcześniejszego zakończenia wyszukiwania liniowego w tablicy jest dość wysokie. W podanym przykładzie, na przykład, zakończysz pierwszy podgląd prawie 2/3 czasu.
Dlaczego po prostu nie próbować odrzucania z wbudowanymi dystrybucjami prawa mocy? –