Pchełki SQL, odcinek 14: Wyznaczamy Pi metodą Monte Carlo

https://xpil.eu/qIdZv

Dzisiaj przedstawię bardzo niepraktyczny sposób na wyliczenie przybliżonej wartości liczby Pi.

Metoda jest niepraktyczna z dwóch powodów: po pierwsze, jest mało dokładna (a także, ze względu na swój losowy charakter, słabo powtarzalna), a po drugie, jest wolnozbieżna - uzyskanie sensownego wyniku wymaga mnóstwa iteracji (około miliona, żeby dostać w miarę dokładnie dwa miejsca po przecinku). Jednak z drugiej strony jest ona banalna obliczeniowo, a także pokazuje, że metodami statystycznymi można dostać się przynajmniej w okolice poprawnego wyniku.

Meritum metody zasadza się na tym, że mamy kwadratową "tarczę" o boku długości jeden, z wpisaną w nią ćwiartką okręgu (w taki sposób, że jeden z narożników kwadratu pokrywa się ze środkiem okręgu). Następnie "strzelamy" losowo w tę tarczę, po czym sprawdzamy ile strzałów trafiło w ćwiartkę, a ile spudłowało. Wreszcie dzielimy jedno przez drugie, wynik mnożymy przez 4 (cały okrąg ma pole powierzchni równe Pi, a więc ćwiartka ma powierzchnię Pi/4, stąd mnożenie) i dostajemy, pi razy oko, wartość Pi.

Kod wygląda następująco:

DECLARE @trafione INT = 0
    , @licznik INT = 0
    , @ilosc_probek INT = 1000000
WHILE @licznik < @ilosc_probek
SELECT
@trafione += CASE WHEN (power(rand(), 2) + POWER(rand(), 2)) < 1.0 THEN 1 ELSE 0 END
, @licznik += 1

SELECT 4.0 * @trafione / @ilosc_probek wynik

Omawiać kodu mi się nie chce, ale jeżeli ktoś czegoś nie zrozumiał, proszę śmiało pytać. Postaram się każde pytanie uważnie zignorować.

https://xpil.eu/qIdZv

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.