<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://zumunterrichten.idea-sketch.com/index.php?action=history&amp;feed=atom&amp;title=Java%2FMonte-Carlo-Methode</id>
	<title>Java/Monte-Carlo-Methode - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://zumunterrichten.idea-sketch.com/index.php?action=history&amp;feed=atom&amp;title=Java%2FMonte-Carlo-Methode"/>
	<link rel="alternate" type="text/html" href="https://zumunterrichten.idea-sketch.com/index.php?title=Java/Monte-Carlo-Methode&amp;action=history"/>
	<updated>2026-05-08T16:13:22Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in ZUM-Unterrichten</subtitle>
	<generator>MediaWiki 1.39.15</generator>
	<entry>
		<id>https://zumunterrichten.idea-sketch.com/index.php?title=Java/Monte-Carlo-Methode&amp;diff=99153&amp;oldid=prev</id>
		<title>Matthias Scharwies: Artikel von Claus Schmitt, importiert aus ZUM-Classic</title>
		<link rel="alternate" type="text/html" href="https://zumunterrichten.idea-sketch.com/index.php?title=Java/Monte-Carlo-Methode&amp;diff=99153&amp;oldid=prev"/>
		<updated>2019-08-25T05:09:37Z</updated>

		<summary type="html">&lt;p&gt;Artikel von Claus Schmitt, importiert aus ZUM-Classic&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In den achtziger Jahren besuchte [[Benutzer:CSchmitt|ich]] mit einer Schulklasse eine Landesgartenschau. Am Eingang musste jeder Besucher einen Pingpong-Ball in eine Öffnung werfen, und eine große Digitalanzeige verriet dann eine nächste Näherung für die Kreiszahl p &amp;amp;hellip;&lt;br /&gt;
&lt;br /&gt;
So mitten im Trubel konnte ich den verdutzten Schülern keine erschöpfende Erklärung bieten; außerdem ging es  an diesem Tage ja auch um Pflanzen. Da es sich jedoch um eine 10.Klasse handelte, bekam ich später einen guten Aufhänger für die Behandlung von &amp;#039;&amp;#039;&amp;#039;Näherungsverfahren für die Kreiszahl&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Fortsetzung|&lt;br /&gt;
vorher=Ulam-Folge|vorherlink=Java/Ulam-Folge|&lt;br /&gt;
weiter=Mustererkennung|weiterlink=Java/Mustererkennung|&lt;br /&gt;
übersicht=Einstieg in Java&amp;lt;br&amp;gt;(Übersicht)|übersichtlink=Java#Übersicht|}}&lt;br /&gt;
&lt;br /&gt;
== Monte-Carlo-Methode zur Bestimmung der Kreiszahl p ==&lt;br /&gt;
=== Mathematischer Hintergrund ===&lt;br /&gt;
[[Datei:Pi_statistisch.png|right|300px]]&lt;br /&gt;
Bei der  Monte-Carlo-Methode approximiert man  p durch sehr spektakuläre stochastische Überlegungen. &lt;br /&gt;
&lt;br /&gt;
In ein Einheitsquadrat mit Einheitsviertelkreis ergießt sich ein Zufallsregen. Die Gesamtzahl &amp;lt;code&amp;gt; g &amp;lt;/code&amp;gt; der Tropfen verhält sich zur Zahl der Tropfen im Viertelkreis &amp;lt;code&amp;gt; v &amp;lt;/code&amp;gt; wie der Inhalt der Quadratfläche zum Inhalt der Viertelkreisfläche. Entsprechend ergibt sich folgende Näherungsgleichung:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monte-carlo-1.png]]&lt;br /&gt;
{{clear}}&lt;br /&gt;
[[Datei:Monte-carlo-2.png|right|250px]]Ein Tropfen treffe im Quadrat in P auf; ist  die Streckenlänge OP kleiner oder gleich 1, befindet sich P sogar im Viertelkreis (, und der Zähler v muss erhöht werden).&lt;br /&gt;
{{clear}}&lt;br /&gt;
=== Struktogramm ===&lt;br /&gt;
[[Datei:Struktogramm-Monte-Carlo.svg|400px]]&lt;br /&gt;
                                 &lt;br /&gt;
{{clear}}&lt;br /&gt;
=== Java-Quelltext / For-Schleife ===&lt;br /&gt;
Die Schleife könnte man wieder mit &amp;quot;Solange&amp;quot; realisieren, wobei man vorher die Zahl der Tropfen &amp;lt;code&amp;gt; i &amp;lt;/code&amp;gt; mit 0 initialisieren müsste; außerdem wäre dafür Sorge zu tragen, dass die Tropfenzahl &amp;lt;code&amp;gt; i &amp;lt;/code&amp;gt; bei jedem Schleifendurchgang um eins erhöht wird und die vereinbarte Gesamtzahl &amp;lt;code&amp;gt; g &amp;lt;/code&amp;gt; nicht übersteigt. Bequemer ist es, wenn man in einem solchen  Falle die sog. [[Java/Schleife#for-Schleife|For-Schleife]] verwendet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// i ++ steht für das Inkrementieren von i um 1 pro Schleifendurchgang&lt;br /&gt;
for (int i = 1; i &amp;lt;= g; i++) {&lt;br /&gt;
  //Schleifenrumpf&lt;br /&gt;
  … &lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                             &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class Pi  {&lt;br /&gt;
  public static void main(String[] args)  {&lt;br /&gt;
    // Gesamtzahl der Tropfen&lt;br /&gt;
    int g = Integer.parseInt(args[0]); &lt;br /&gt;
    // Tropfen im Viertelkreis&lt;br /&gt;
    int v = 0;&lt;br /&gt;
    // Koordinaten des Punktes P &lt;br /&gt;
    double x,y;&lt;br /&gt;
    System.out.println(&amp;quot; Monte Carlo Methode&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; Naeherung fuer Pi:&amp;quot;);&lt;br /&gt;
    for (int i = 1; i &amp;lt;= g; i++)   {	&lt;br /&gt;
      x = Math.random();&lt;br /&gt;
      y = Math.random();&lt;br /&gt;
      if (Math.hypot(x,y) &amp;lt;= 1)	&lt;br /&gt;
        v = v + 1;&lt;br /&gt;
    }  &lt;br /&gt;
    double pi = 4*(double)v / g; &lt;br /&gt;
    System.out.printf(&amp;quot; %d Tropfen, davon %d Tropfen im Viertelkreis, Pi etwa %g%n&amp;quot;,g,v,pi);	 &lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monte-carlo-6.png]]	    &lt;br /&gt;
&lt;br /&gt;
Für die Koordinaten und für &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; benötigt man Gleitkommazahlen; diese werden durch den Datentyp &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; bereitgestellt.&lt;br /&gt;
* &amp;lt;code&amp;gt;Math.random()&amp;lt;/code&amp;gt; liefert Zufallszahlen von 0 bis (ausschließlich) 1.&lt;br /&gt;
* &amp;lt;code&amp;gt;Math.hypot(x,y)&amp;lt;/code&amp;gt; berechnet die Streckenlänge OP (Hypotenusenlänge).&lt;br /&gt;
* Das &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; bei der Berechnung der Näherung für &amp;lt;code&amp;gt; p &amp;lt;/code&amp;gt; ist notwendig, da sonst eine Ganzzahldivision durchgeführt würde.&lt;br /&gt;
* Im Formatstring ist &amp;lt;code&amp;gt; %g &amp;lt;/code&amp;gt; ein Platzhalter für eine Gleitkommazahl.&lt;br /&gt;
&lt;br /&gt;
=== Benutzereingaben über den Scanner ===&lt;br /&gt;
Der Benutzer soll zur Laufzeit die gewünschte Tropfenzahl eingeben können; dafür führen wir das sog. Scanner-Objekt  - zunächst als &amp;quot;black box&amp;quot;- ein.&lt;br /&gt;
&lt;br /&gt;
Wir interessieren uns für das Konvergenzverhalten der Monte-Carlo-Methode; deshalb lassen wir uns schon im Schleifendurchgang jeweils nach 100 Iterationsschritten den aktuellen Näherungswert ausgeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.Scanner;&lt;br /&gt;
class Pi_1  {&lt;br /&gt;
  public static void main(String[] args)  {&lt;br /&gt;
    // Das System liest von der Standardeingabe&lt;br /&gt;
    Scanner s = new Scanner(System.in);&lt;br /&gt;
    System.out.println(&amp;quot; Wie viele Tropfen soll es regnen?&amp;quot;);&lt;br /&gt;
    int g = s.nextInt();&lt;br /&gt;
    // Tropfen im Viertelkreis&lt;br /&gt;
    int v = 0;&lt;br /&gt;
    // Koordinaten des Punktes P &lt;br /&gt;
    double x,y;&lt;br /&gt;
    for (int i = 1; i &amp;lt;= g; i++)   {	&lt;br /&gt;
	x = Math.random();&lt;br /&gt;
	y = Math.random();&lt;br /&gt;
	if (Math.hypot(x,y) &amp;lt;= 1)	&lt;br /&gt;
	  v++;&lt;br /&gt;
	double pi = 4*(float)v / i;&lt;br /&gt;
	if (i%100 == 0)  &lt;br /&gt;
	  System.out.printf(&amp;quot; Nach %6d Tropfen ist die Naeherung fuer Pi  %g%n&amp;quot;,i,pi);	 &lt;br /&gt;
    }  &lt;br /&gt;
  }&lt;br /&gt;
}	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monte-carlo-3.png]]&lt;br /&gt;
&lt;br /&gt;
Wir erkennen an dieser Stelle: Unsere Methode ist zwar sehr spektakulär, aber sie konvergiert sehr langsam &amp;amp;hellip;&lt;br /&gt;
&lt;br /&gt;
Konvergiert das Verfahren überhaupt?&lt;br /&gt;
&lt;br /&gt;
Wir müssen uns verabschieden von der Schleife vorgegebener Länge; das Verfahren soll so lange laufen, bis eine &amp;quot;vernünftige&amp;quot; Näherung erreicht ist. Aber wie realisiert man eine &amp;quot;[[Java/Schleife#while-Schleife|Wiederhole-Schleife]]&amp;quot; in Java?&lt;br /&gt;
&lt;br /&gt;
=== Wiederhole-Schleife ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
// Jetzt soll die Iteration abgebrochen werden, wenn sich die Näherungswerte&lt;br /&gt;
// nur noch im Rahmen eines vorgegebenen Epsilon-Bereiches ändern&lt;br /&gt;
class Pi_2  {&lt;br /&gt;
  public static void main(String[] args)  {&lt;br /&gt;
    int i = 0;&lt;br /&gt;
    int v = 0;&lt;br /&gt;
    // Startwert von Pi für den ersten Vergleich&lt;br /&gt;
    double pi = 3;&lt;br /&gt;
    double x,y,pi_alt;&lt;br /&gt;
    // Falls sich zwei Näherungswerte um höchstens diese Differenz epsi&lt;br /&gt;
    // unterscheiden, soll die Iteration abgebrochen werden&lt;br /&gt;
    double epsi = 1.E-5;&lt;br /&gt;
    do   {&lt;br /&gt;
      i++;   // Tropfenzahl&lt;br /&gt;
      pi_alt = pi;&lt;br /&gt;
      x = Math.random();&lt;br /&gt;
      y = Math.random();&lt;br /&gt;
      if (Math.hypot(x,y) &amp;lt;= 1)&lt;br /&gt;
        v++;  // Tropfen im Viertelkreis&lt;br /&gt;
      pi = 4*(float)v / i;&lt;br /&gt;
    }&lt;br /&gt;
    while (Math.abs(pi_alt - pi) &amp;gt; epsi);  &lt;br /&gt;
    System.out.printf(&amp;quot; Nach %6d Tropfen ist die Naeherung fuer Pi  %g%n&amp;quot;,i,pi);&lt;br /&gt;
    //System.out.printf(&amp;quot; Der Konvergenzbereich ist %g breit&amp;quot;, 2*epsi);   &lt;br /&gt;
  }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monte-carlo-4.png]]&lt;br /&gt;
&lt;br /&gt;
Die drei Aufrufe des Programmes verdeutlichen, wie sich im Sinne des Gesetzes der großen Zahl der Wert von p herauskristallisiert; allerdings ist eine sehr große Tropfenzahl für eine vergleichsweise &amp;quot;bescheidene&amp;quot; Näherung erforderlich; das Konvergenzverhalten des Verfahrens ist also &amp;quot;ungünstig&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Operatoren ===&lt;br /&gt;
Außerdem kann man mit dem o.g. Quelltext auch Überraschungen erleben: Ggf. steigt das Programm z.B. mit der Meldung aus, dass es nach 2 Tropfen eine Näherung 4 für &amp;lt;code&amp;gt; p &amp;lt;/code&amp;gt; gäbe. Wie man leicht sieht, folgt dies, wenn die ersten Tropfen alle im Viertelkreis landen.&lt;br /&gt;
&lt;br /&gt;
Um auch dies zu berücksichtigen, passen wir unsere Schleifenbedingung an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 while ((Math.abs(pi_alt - pi) &amp;gt; epsi) || (i &amp;lt; 10));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Die Schleife soll also in jedem Fall für die ersten 9 Tropfen weiterlaufen; als logischen Operator haben wir &amp;lt;code&amp;gt; || &amp;lt;/code&amp;gt;(für ODER) gewählt.&lt;br /&gt;
&lt;br /&gt;
Weitere [[Java/Algorithmik#Operatoren|logische Operatoren]] sind &amp;lt;code&amp;gt; &amp;amp;&amp;amp; &amp;lt;/code&amp;gt; ( für UND) und &amp;lt;code&amp;gt; ! &amp;lt;/code&amp;gt; (für NICHT).&lt;br /&gt;
&lt;br /&gt;
An arithmetischen Operatoren haben wir bereits kennengelernt: &amp;lt;code&amp;gt;+   -   *   /   %&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Relationale Operatoren &amp;lt;code&amp;gt;&amp;lt;     &amp;gt;    &amp;lt;=     &amp;gt;=    ==     != &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Runden ===&lt;br /&gt;
Wie viele Tropfen unseres Zufallsregens sind nun notwendig, um p wenigstens auf 4 Dezimalen zu bestimmen?&lt;br /&gt;
&lt;br /&gt;
Ausgehend von &amp;lt;code&amp;gt;pi = 4*(float)v / i;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
kann man z.B. pi mit 10000 multiplizieren, auf Einer runden und durch 10000 dividieren. &lt;br /&gt;
&lt;br /&gt;
Aus dem unteren Teil des Schleifenrumpfes würde dann&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;    ......&lt;br /&gt;
  pi = 4*(float)v / i;&lt;br /&gt;
  pi = Math.round(10000 * pi)/10000.0;&lt;br /&gt;
  }&lt;br /&gt;
 while (pi != 3.1415);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier verdeutlichen die 5 Aufrufe, dass  sogar das verhaltene Tempo der Konvergenz sehr statistisch ist.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Monte-carlo-5.png|Monte-carlo-5.png]]&lt;br /&gt;
&lt;br /&gt;
{{Fortsetzung|&lt;br /&gt;
vorher=Ulam-Folge|vorherlink=Java/Ulam-Folge|&lt;br /&gt;
weiter=Mustererkennung|weiterlink=Java/Mustererkennung|&lt;br /&gt;
übersicht=Einstieg in Java&amp;lt;br&amp;gt;(Übersicht)|übersichtlink=Java#Übersicht|}}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* {{wpde|Monte-Carlo-Methode}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Java]]&lt;/div&gt;</summary>
		<author><name>Matthias Scharwies</name></author>
	</entry>
</feed>