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.
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\) mitTOTAL_CYCLES
zufällig gezogenen Punkten dauert.