Problem bei Programmierung von Monte-Carlo-Integration

Ich hatte mich an dieser Aufgabe probiert, aber ich bekomme es leider nicht hin.
Ich wäre für eine freundliche Antwort sehr dankbar.

Aufgabe:
In dieser Aufgabe geht es darum, die Zahl Pi genähert zu berechnen. Um Pi zu ermitteln, genügt es, die Fläche des Viertels des Einheitskreises zu berechnen. Der Einheitskreis ist ein Kreis mit dem Radius 1. Da die Fläche des Einheitskreises gleich Pi ist, muss man nur die ermittelte Fläche des Viertelkreises mit 4 multiplizieren um auf Pi zu kommen. Diese Idee ist in der folgenden Abbildung dargestellt. Man bestimmt zufällige Punkte in einem Einheitsquadrat (d.h., in einem Quadrat mit der Kantenlänge 1). Die Fläche unter dem Viertelkreis ist dann ungefähr gleich der Anzahl der Punkte, die unter der Kreislinie liegen, dividiert durch die Gesamtzahl der Punkte. Dieses Verfahren zur Ermittlung einer Fläche (allgemeiner: eines bestimmten Integrals) heißt wegen seines Zufallscharakters auch Monte-Carlo-Integration.
12591
Schreiben Sie eine Klasse Pi, welche eine Methode main() enthält, die mittels Monte-Carlo-Integration einen Näherungswert für Pi berechnet. Lesen Sie dazu eine ganze Zahl ein, die angibt, wie viele Punkte „gewürfelt“ werden sollen. Würfeln Sie entsprechend oft und berechnen Sie den Quotienten aus der Anzahl der Punkte unter der Kreislinie durch die Gesamtzahl der Punkte. Ein Punkt (x, y) liegt unter der Kreislinie, wenn x² + y² <= 1.0 gilt.
Zum „Würfeln“ eines Punktes (x, y) ermitteln Sie für die x- und y-Koordinate jeweils eine reelle Pseudo-Zufallszahl r mit der Eigenschaft 0.0 <= r <= 1.0. Eine solche Pseudo-Zufallszahl erhalten Sie z.B. durch den folgenden Methodenaufruf:
double r = Math.random();
 
import utilities.TastaturEingabe;
public class Pi
{
public static void main(String[] argv)
{
int zufall, i;
double uh;

System.out.println("Geben Sie eine ganze positive Zahl ein!");
zufall = TastaturEingabe.readInt("Wie oft soll gewürfelt werden? ");

for(i=0;i<zufall;i++)
{
randX = Math.random() * (0.0 <=randX <= 1.0);
randY = Math.random() * (0.0 <=randY <= 1.0);
if(i > ((randX*randX) + (randY*randY))) ++circle;
pi = 4 * (circle/zufall);
System.out.print(pi);
}


}
}
Ich habe mal das letzte kopiert was ich zuletzt geschrieben hatte (Mein Code müsste inzwischen total falsch sein).
Ich habe Probleme 0.0 <= r <= 1.0 hinzubekommen mit Math.random.
 
r mit der Eigenschaft 0.0 <= r <= 1.0 .
Diese Zeile verwirrt mich.
Wenn ich also double r = Math.random() eingebe, ist es genau dasselbe?
Da muss ja noch was fehlen, sonst wäre es ja zu einfach.
Ich wollte probieren double r = Math.random()* 1.0);
Ich kenn mich mit Math.random() nicht sehr gut aus.
 
Ich werde die Aufgabe morgen genauer bearbeiten und mein Code nochmal hier reinkopieren.
Schonmal vielen Dank für die, die sich mit meinem Thema auseinandersetzen.:)
 
Wenn ich also double r = Math.random() eingebe, ist es genau dasselbe?
Es ist nicht genau das selbe (es gilt 0 <= r < 1) aber die Abweichung zu 1 ist derart gering, dass sie keine Rolle spielt. Abgesehen davon interpretiere ich die Aufgabenstellung so, dass Du tatsächlich einfach Math.random() verwenden sollst.
 
Java:
//import utilities.TastaturEingabe;
public class Pi
{
  public static void main(String[] argv)
  {
    int ganzezahl;
    double x=0, y=0, xquadrat, yquadrat, qgesamt,  punkt=0, gesamt=0, pi=0; //quotient=0;
  
    //System.out.println("Geben Sie eine ganze positive Zahl ein!");
    //ganzezahl = TastaturEingabe.readInt("Wie oft soll gewürfelt werden? ");
  
    ganzezahl = 2;
  
    for(int i=0; i<ganzezahl;i++)
    {
      x = Math.random();
      y = Math.random();
      System.out.println("X-Achse "+x);
      System.out.println("Y-Achse "+y);
      xquadrat = x*x;
      System.out.println("X-Quadrat "+xquadrat);
      yquadrat = y*y;
      System.out.println("Y-Quadrat "+yquadrat);
      qgesamt = xquadrat*yquadrat;
      System.out.println("Gesamt "+qgesamt);
    
      if(qgesamt<=1.0){
        punkt++;
        gesamt++;
      }//Ende if
      else{
        gesamt++;
      }//Ende else
    }//Ende for-Schleife
  
   // quotient = punkt/gesamt;
    pi = 4*punkt/gesamt;
    System.out.print("Quotient "+pi);
  }
}

Ich habe meinen Code jetzt nochmal etwas überarbeitet.
Leider komme ich bei meinem Quotienten immer nur auf 1.0?
Hat hier noch jemand eine Idee?
Sicher habe ich irgendwo eine Kleinigkeit übersehen.
 
Zuletzt bearbeitet von einem Moderator:
Bitte nutze [code=java]...[/code] Tags. Und: Du hast nicht die richtige Kreisformel implementiert. Du solltest prüfen, ob `x² + y² ≤ 1`. Aktuell prüfst du: `x² · y² ≤ 1`, was immer true ist.
 
Java:
import utilities.TastaturEingabe;
public class Pi
{
  public static void main(String[] argv)
  {
    int ganzezahl; 
    double x=0, y=0, xquadrat, yquadrat, qgesamt,  punkt=0, gesamt=0, pi=0; //quotient=0;
    
    System.out.println("Geben Sie eine ganze positive Zahl ein!");
    ganzezahl = TastaturEingabe.readInt("Wie oft soll gewürfelt werden? ");
    
    //ganzezahl = 100;
    
    for(int i=0; i<ganzezahl;i++)
    {
      x = Math.random();
      y = Math.random();
      System.out.println("X-Achse "+x);
      System.out.println("Y-Achse "+y);
      xquadrat = x*x;
      yquadrat = y*y;
      qgesamt = xquadrat+yquadrat;
      
      if(qgesamt<=1.0){
        punkt++;
        gesamt++;  
      }//Ende if
      else{
        gesamt++;
      }//Ende else
    }//Ende for-Schleife  
    
   // quotient = punkt/gesamt;
    pi = 4*punkt/gesamt;
    System.out.print("Quotient "+pi);
  }
}
Da hatte ich mich wohl vertippt bei der Addition.
Vielen Dank an alle, das Programm funktioniert jetzt.
Wenn ich noch was übersehen habe, oder wenn jemanden noch etwas auffällt bitte melden.:)
 
Nicht jeder wird das Package "utilities.TastaturEingabe;" haben...
Eine universellere Lösung geht über
Code:
import java.util.Scanner;
und
Code:
//ganzezahl = TastaturEingabe.readInt("Wie oft soll gewürfelt werden? ");
    ganzezahl = scanner.nextInt();
Und zwecks einen schnelleren Ergebnisses kann man die Zeilen
Code:
System.out.println("X-Achse "+x);
      System.out.println("Y-Achse "+y);
ebenfalls auskommentieren.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben