Zahl Pi probabilistisch berechnen (Kritik/Verbesserungsvorschläge)

ZERG

Mitglied
Hey Leute, habe eine Klasse für Pi berechnung erstellt und würde gerne eure Meinung dazu hören. Die Berechnung basiert auf probabilistischem Verfahren. Würde auch gerne wissen, ob man meine Dokumentation versteht. Vielen Dank!

Java:
import java.lang.Math;
/**
 * 	Diese Klasse erzeugt einen Simulator, der mit probabilistischem Verfahren die Zahl
 *	Pi berechnet.
 */
public class PiSimulator
{
	/**	Anzahl der Punkte, die im Kreis liegen. */
	private int punkteImKreis;

	/**	Anzahl der Punkte, die im Kreis und ausserhalb liegen. */
	private int punkteGesamtanzahl;

	/**	Differenz von Pi und Naeherungswert. */
	private double tatsaechlicheAbweichung;

	/**	Initialisiert alle Klassenvariablen. */
	public PiSimulator()
	{
		punkteImKreis = 0;
		punkteGesamtanzahl = 0;
		tatsaechlicheAbweichung = 1;
	}

	/**
	 * 	Berechnet den Naeherungswert dessen Abweichung von der Zahl Pi gleich oder kleiner
	 *	der erlaubten Abweichung ist.
	 *	@param	Die erlaubte Abweichung.
	 */
	public void simulierePi(double erlaubteAbweichung)
	{
		while (tatsaechlicheAbweichung > erlaubteAbweichung || tatsaechlicheAbweichung < 0)
		{
			double xKoordinate = Math.random();
			double yKoordinate = Math.random();
		  if (xKoordinate * xKoordinate + yKoordinate * yKoordinate <= 1)
			{
		    punkteImKreis++;
			}
	 		punkteGesamtanzahl++;
		  tatsaechlicheAbweichung = (4*(double)punkteImKreis/punkteGesamtanzahl) - Math.PI;
		}
	}

	/**
	 * 	Liefert den Naeherungswert der Simulation.
	 * 	@return    Der Naeherungswert der Simulation.
	 */
	public double liefereNaeherungswert()
	{
		return Math.PI + tatsaechlicheAbweichung;
	}

	/**
	 * 	Liefert die Anzahl der Punkte, die nicht im Kreis liegen.
	 * 	@return    Die Anzahl der Punkte, die nicht im Kreis liegen.
	 */
	public int lieferePunkteGesamtanzahl()
	{
		return punkteGesamtanzahl;
	}

	/**
	 * 	Liefert die Anzahl der Punkte, die im Kreis liegen.
	 * 	@return    Die Anzahl der Punkte, die im Kreis liegen.
	 */
	public int lieferePunkteImKreis()
	{
		return punkteImKreis;
	}

	/**
	 * 	Liefert die Anzahl der Punkte, die nicht im Kreis liegen.
	 * 	@return    Die Anzahl der Punkte, die nicht im Kreis liegen.
	 */
	public int lieferePunkteNichtImKreis()
	{
		return punkteGesamtanzahl - punkteImKreis;
	}

	/**
	 * 	Liefert die Differenz von Pi und Naeherungswert.
	 * 	@return    Die Differenz von Pi und Naeherungswert.
	 */
	public double liefereTatsaechlicheAbweichung()
	{
		return tatsaechlicheAbweichung;
	}
}
 
Deine while-Schleife gefällt mir nicht. Spricht man von einer Abweichung, die nicht größer als eine gegeben Konstante sein soll, so meint man in der Regel doch, dass der Absolutbetrag von der Differenz zwischen Näherungslösung und tatsächlicher Lösung nicht größer als diese gegebene Konstante sein soll.

Aber ich finde es bei der von dir gewählten Methode ohnehin fragwürdig eine gewünschte Genauigkeit vorzugeben. Eine beliebige Genauigkeit kannst du nämlich gar nicht garantieren, dafür eignet sich dein Verfahren nicht. Sinnvoller wäre es einfach für eine frei wählbare Anzahl an Durchläufen einfach mal zu schauen, was du denn für einen NäherungsWert für Pi erhälst. Diesen kann man dann natürlich immer noch spaßeshalber mit dem "richtigen" (Math.PI liefert ja auch nur eine Näherung) Wert vergleichen.
In der Methode, in der du PI berechnen möchtest, aber bereits den "exakten" Wert zu verwenden, ist ziemlicher Quatsch.

Wenn du Pi auf eine bestimmte vorgegebene Genauigkeit bestimmen willst, dann musst du dir aber wohl etwas anderes einfallen lassen.
 
Danke.

Die erlaubte abweichung ist durch die Aufgabenstellung vorgeschrieben. Die Benutzer des Programms geben die gewünschte Abweichung ein und dann läuft die Schleife bis die Abweichung kleiner oder gleich ist.
 

Zurück
Oben