pp.08.01-ConcurrencyMonteCarloPiSeq

Monte-Carlo-Algorithmus zur Annäherung von \(\pi\) – sequenziell

  • Projekt: pp.08.01-ConcurrencyMonteCarloPiSeq
  • Bearbeitungszeit: 5 Minuten
  • Musterlösung: 5 Minuten
  • Kompatibilität: mindestens Java SE 16

Quellcode von pp.InOutTuple

Der Typ InOutTiple wird hier verwendet, um die Anzahl der zufällig gezogenen Punkte innerhalb und außerhalb des Einheitsviertelkreises zu repräsentieren.

package pp;

public record InOutTuple(int in, int out) {
}

Seit Java 16 gibt es das Schlüsselwort record. Damit wird eine immutable POJO-Klasse mit den angegebenen Properties (hier in und out, beide vom Typ int) und passenden Gettern automatisch erzeugt. Zusätzlich hat eine so erzeugte Klasse auch passende toString, equals- und hashCode-Methoden.

Quellcode von pp.MonteCarloPiSeq

package pp;

public class MonteCarloPiSeq {
  static final int TOTAL_CYCLES = 10000000;

  public static InOutTuple getResultMonteCarloPiDraw(int cycles) {
    var in = 0;
    var out = 0;
    var r = new Random();
    for (var i = 0; i < cycles; i++) {
      var x = r.nextDouble();
      var y = r.nextDouble();
      if (Math.sqrt((x * x) + (y * y)) <= 1.0) {
        in++;
      } else {
        out++;
      }
    }
    return new InOutTuple(in, out);
  }

  /**
   * main-Methode
   *
   * @param args Kommandozeilenparameter (nicht benutzt)
   */
  public static void main(String... args) {
    var result = getResultMonteCarloPiDraw(TOTAL_CYCLES);
    var pi = ((4.0 * result.in()) / (result.in() + result.out()));
    System.out.println(pi);
  }

}

Die Konstante TOTAL_CYCLES gibt an, wieviele Punkte insgesamt gezogen werden sollen. Das ist sozusagen das Rechenziel.

Aufgaben

  • Analysieren Sie die Struktur und Funktion des Programms.
  • Fügen Sie Code in die main-Methode ein, um herauszufinden wie lange die Berechnung der Annäherung von \(\pi\) mit TOTAL_CYCLES zufällig gezogenen Punkten dauert.