Obliczanie liczby pi metodą Monte Carlo w javie

Algorytm rozwiązywania równania liniowego

Schemat algorytmu obliczania liczby pi metodą Monte Carlo

import java.util.Scanner;

public class Pi {
  public static void main(String[] args) {
    Scanner klaw=new Scanner(System.in);
    System.out.print("n = ");
    int n=klaw.nextInt();
    double x,y;
    int k=0;
    for(int i=1; i<=n; i++){
      x=Math.random();
      y=Math.random();
      if(x*x+y*y<=1) k++;
    }
    double p=4.*k/n;
    System.out.println(p);
  }  
}

 

 

Przygotowanie i Wejście danych

Na początku program przygotowuje środowisko i pobiera dane wejściowe.

  • Kod: public class Pi { ... main ... Scanner klaw=...
    • Schemat: Krok 1 (START). Te linie to standardowa struktura programu w Javie, odpowiadająca za uruchomienie procesu.
  • Kod: System.out.print("n = "); oraz int n=klaw.nextInt();
    • Schemat: Krok 2 (Czytaj: n). Program prosi użytkownika o podanie liczby n (całkowitej liczby losowanych punktów) i zapisuje ją w pamięci.

Inicjalizacja zmiennych

Przed wejściem w pętlę program musi ustawić liczniki.

  • Kod: int k=0;
    • Schemat: Krok 3 (część pierwsza: k:=0). Zmienna k (liczba punktów trafionych w koło) jest zerowana.
  • Kod: for(int i=1; ...)
    • Schemat: Krok 3 (część druga: i:=1). Inicjalizacja pętli for ustawia licznik i na wartość początkową 1.

Pętla główna (Symulacja Monte Carlo)

Wewnątrz pętli realizowana jest główna logika algorytmu. Pętla for w Javie kompaktowo realizuje kilka kroków ze schematu blokowego jednocześnie.

  • Kod: x=Math.random(); oraz y=Math.random();
    • Schemat: Krok 4 (x:=random, y:=random). Program losuje współrzędne punktu. Funkcja Math.random() generuje liczby z przedziału 0.0 do 1.0, co odpowiada ćwiartce koła wpisanej w kwadrat jednostkowy.
  • Kod: if(x*x+y*y<=1) ...
    • Schemat: Krok 5 (Decyzja: x2+y2<=1). Jest to warunek sprawdzający, czy wylosowany punkt (x,y) leży wewnątrz koła o promieniu 1 (zgodnie z twierdzeniem Pitagorasa).
  • Kod: ... k++;
    • Schemat: Krok 6 (k:=k+1). Ta instrukcja wykonuje się tylko wtedy (ścieżka "T" na schemacie), gdy warunek z kroku 5 jest spełniony. Zwiększamy licznik trafień. Jeśli warunek nie jest spełniony (ścieżka "N"), ten krok jest pomijany.
  • Kod: ... i++) (część nagłówka pętli for)
    • Schemat: Krok 7 (i:=i+1). Po wykonaniu ciała pętli następuje inkrementacja licznika i.
  • Kod: ... i<=n; ... (warunek w nagłówku pętli for)
    • Schemat: Krok 8 (Decyzja: i<=n). Program sprawdza, czy wykonano już n powtórzeń.
      • Jeśli Tak (T): Pętla kontynuuje działanie (wraca do kroku 4 – strzałka w górę na schemacie).
      • Jeśli Nie (N): Pętla się kończy i program przechodzi dalej.

Obliczenia końcowe i Wynik

Po zakończeniu pętli następuje obliczenie przybliżenia i wyświetlenie wyniku.

  • Kod: double p=4.*k/n;
    • Schemat: Krok 9 (p:=4∗k/n). Obliczenie wartości π. Użycie 4. (z kropką) w kodzie wymusza dzielenie zmiennoprzecinkowe, co jest kluczowe dla dokładności wyniku.
  • Kod: System.out.println(p);
    • Schemat: Krok 10 (Pisz: p). Wypisanie obliczonego wyniku na ekran.
  • Kod: } } (klamry zamykające)
    • Schemat: Krok 11 (STOP). Zakończenie działania programu.

Wnioski: Program wiernie odwzorowuje algorytm ze schematu blokowego. Jedyną różnicą techniczną jest to, że pętla for w Javie grupuje inicjalizację (krok 3), inkrementację (krok 7) i warunek końcowy (krok 8) w jednej linii kodu, co jest standardową praktyką programistyczną.