Game-Apps für Smartphones und Tablets

Bern University oh Teacher Education  
HomeOnline-Editor startenDruckenAndroid-TurtlegrafikJava-Online

Berechnung der Zahl PI mit der MonteCarlo Methode


Auf ein Quadrat mit der Seitenlänge 1 werden Zufallspunkte gestreut, deren Koordinaten mit zwei Zufallszahlen zwischen 0 und 1 bestimmt sind. Aus dem Verhältnis der Zahl der Punkte, die innerhalb des Viertelkreises liegen (Treffer) zu allen Punkten (Zufallspunkte), kann die Zahl PI berechnet werden.


 

Beispiel im Online-Editor bearbeiten

App installieren auf Smartphone oder Tablet

 

QR-Code

Programmcode downloaden (MonteCarlo.zip)

   

Programmcode:
// MonteCarlo.java

package app.montecarlo;

import ch.aplu.android.*;

public class MonteCarlo extends GameGrid 
{
  
  private GGPanel p; 
  private int n ;
  private int hits = 0;
  private GGStatusBar status;  
   
  public MonteCarlo()
  {
    super(WHITE, windowZoom(400));
    status = addStatusBar(30);
  }  
  
  public void main()
  {
    p = getPanel(-.2, 1.2, -.2, 1.2);
    n = Integer.parseInt(GGInputDialog.show("Number of random points: " , ""));
    p.rectangle(0, 0, 1, 1, false)
    p.move(0,0);
    p.arc(1, 0, 90false);
    status.setText("Berechnung der Zahl PI mit Monte Carlo Methode");
    simulate(); 
    double pi = * (double)hits / n;
    status.setText(" Die Zahl PI ist " + pi);
    refresh();      
  }
  
  private void simulate()
  {
    double zx, zy;
    hits = 0;
    p.setAutoRefreshEnabled(false);
    for (int = 0; i < n; i++)
    {
      zx = Math.random();
      zy = Math.random();
      if (zx * zx + zy * zy < 1)
      {
        hits = hits + 1;
        p.setPaintColor(RED);
      }
      else
        p.setPaintColor(GREEN);
      p.point(zx, zy);
    }
  }
}

Erklärungen zum Programmcode:
n = Integer.parseInt(GGInputDialog.show
("Number of random points: " , "")); 
Der Inputdialog einget sich für eingabe von Werten während der Programmausführung. Die Eingabe muss in eine int-Zahl umgewandelt werden
p.setAutoRefreshEnabled(false) Ohne diese Zeile macht das Programm nach jedem neu erzeugten Punkt refresh() und zeichnet alle Punkte neu. Dadurch dauert die Programmausführung bei grösseren Zahlen sehr lange. setAutorefreshEmable(false) verhindert die Aktualisierung der ganzer Grafik nach jedem Punkt und die Programmausführung wird wesentlich schneller