Jak wygenerować wartości zmiennej losowej o dowolnym rozkładzie?

odwracając dystrybuantę

Metoda opiera się na spostrzeżeniu, że jeśli $$u \sim U(0,1)$$ czyli wartość \(u\) została wylosowana z rozkładu jednorodnego na przedziale \((0;1)\), oraz \(F(x)\) jest dystrybuantą rozkładu, z którego chcemy losować, to $$F^{-1}(u)$$ będzie zwracać wartości o żądanym rozkładzie.

Przykład

Weźmy ciągłą zmienną losową określoną na przedziale \((0;2)\) o gęstości prawdopodobieństwa równej \(\rho(x)=\frac{x}{2}\). Możemy od razu policzyć dystrybuantę: $$F(x) = \int_{0}^{x} \rho(s) ds = \frac{x^2}{4}\,.$$

Zatem, funkcja odwrotna do dystrybuanty wynosi $$F^{-1}(u) = 2\sqrt{u}\,.$$

import numpy

# generujemy 100 liczb z rozkładu jednorodnego
u = numpy.random.random(100)

# przeliczamy na tyle samo liczb o zadanej gęstości prawdopodobieństwa
x = 2 * numpy.sqrt(u)  # tutaj korzystamy z numpy.sqrt zamiast math.sqrt
                       # bo chcemy operować na całej tablicy naraz
autor: Piotr Różański, ostatnia modyfikacja: 10.04.2016