Obliczanie liczby pi metodą Monte Carlo w pascalu

Algorytm rozwiązywania równania liniowego

Schemat algorytmu obliczania liczby pi metodą Monte Carlo

program Liczba_pi;
var i, n, k: integer;
  x, y, p: double;
begin
  write('Liczba losowanych punktow n = ');
  readln(n);
  randomize;
  k:=0;
  for i:=1 to n do begin
    x:=random;
    y:=random;
    if (x*x + y*y)<=1 then k:= k+1;
  end;
  p:=4*k/n;
  writeln('pi = ', p:10:8);
  readln;
end.

 

 

 Pierwszą linię programu możemy traktować jako ozdobnik, jednak wymagany przez składnię języka pascal. Każdy program w pascalu musi się zaczynać słowem kluczowym program poprzedzającym nazwę programu, nie wnosi nic do realizacji algorytmu. Trzecia i czwarta linia mają charakter pomocniczy. Wiemy, że nasz algorytm korzysta z trzech zmiennych przechowujących liczby całkowite i trzech zmiennych przechowujących liczby rzeczywiste. W pascalu wszystkie zmienne muszą być zadeklarowane przed rozpoczęciem bloku kodu. Deklarując zmienną musimy podać jakiego typu dane będą w niej przechowywane. Deklaracja zmiennych rozpoczyna się słowem kluczowym var

 Szósta linia zawierająca słowo kluczowe begin odpowiada blokowi startowemu (1) naszego algorytmu.

 Linie 7 i 8 realizują operację wejścia/wyjścia (2), w której pobierane są dane wejściowe - liczba losowanych punktów n.

 W linii 9 wywołujemy funkcję biblioteki standardowej randomize. Jest to funkcja inicjująca wbudowany generator liczb pseudolosowych przypadkową wartością tworzoną na podstawie aktualnej w momencie wykonania zawartości zegara systemowego. Gdybyśmy nie wywołali tej funkcji program przy każdym uruchomieniu generowałby ten sam ciąg liczb pseudolosowych i w rezultacie dla określonej liczby losowanych punktów otrzymywalibyśmy zawsze ten sam wynik. W każdym programie w pascalu, w którym wykorzystujemy generator liczb pseudolosowych powinniśmy jeszcze przed pierwszym losowaniem raz wywołać funkcję randomize.

 W linii 10 zerujemy k - licznik punktów leżących w kole o promieniu 1 (3).

  Linia 11 rozpoczyna instrukcję pętli for. Instrukcje zawarte pomiędzy słowami kluczowymi begin i end zostaną wykonane n razy (zmienna sterująca i pętli zmienia się od 1 do n, za każdym razem zwiększając swą wartość o 1). Linia 11 realizuje część punktu (3) algorytmu inicjując na początku zmienną i wartością 1 oraz punkty (7) i (8) algorytmu, zwiększając po każdym wykonaniu instrukcji pętli zmienną sterującą i o 1 i sprawdzając, czy wartość liczby i nie przekroczyła jeszcze górnej granicy pętli (i<=n). Wewnątrz pętli for wykonywana jest zawsze dokładnie jedna instrukcja. Jeżeli potrzebujemy w tym miejscu, tak jak ma to miejsce w naszym przykładzie, więcej instrukcji, musimy je zapisać pomiędzy słowami kluczowymi begin i end jako instrukcję złożoną.

 Instrukcje wykonywane w pętli zawarte są w liniach 12 - 14. Dla każdego losowanego punktu najpierw losujemy jego współrzędne x i y - punkt (4) algorytmu. Do losowania wykorzystujemy biblioteczną funkcję random, której wynikiem jest liczba losowa (pseudolosowa) typu double z zakresu od 0 do 1. Następnie w linii 14 sprawdzamy, czy punkt o wylosowanych współrzędnych x, y leży w kole o promieniu 1 (5). Jeśli tak to dalej w tej samej linii po słowie kluczowym then zwiększamy zawartość zmiennej k o 1 (6).

 Po zakończeniu pętli zmienna n zawiera całkowitą liczbę wylosowanych punktów (zawartość zmiennej n nie uległa zmianie), a zmienna k zawiera informację o liczbie wylosowanych punktów leżących w kole o promieniu 1.

 W linii 16 przypisujemy do zmiennej p przybliżoną wartość liczby π (9), a następnie w linii 17 wypisujemy otrzymany wynik (blok wejścia-wyjścia (10)).

 Instrukcja readln w linii 18 nie ma żadnego związku z wykonaniem algorytmu. Służy ona zatrzymaniu programu do czasu naciśnięcia klawisza enter, co zapobiega natychmiastowemu zamknięciu okienka z programem.

 Instrukcja end. z linii 19 kończy działanie programu (blok końca algorytmu (11)).