# Monte Carlo Methode zur Bestimmung von PI



## Mattes_01 (20. Apr 2006)

Hi Habe da mal wieder ein Problem....

Naja das klappt alles, ausser wenn ich das compilierte ausführen will, dann klappts nicht und ich finde den Fehler nicht 

Villeicht hat einer von euch ne Idee:


```
class MonteCarlo
{
	public static void main (String[]args)
	{
		double xkoodrinate = 0, ykoordinate = 0;
		double laenge = 0;
		double hilfsval;
		int zaehlerdrin = 0, zaehlerdraussen = 0;
		int i = 0;
		
		for (i = 1; i <= 500; i++)
		{
			double zufallszahlx = (int) Math.random(); 
			double zufallszahly = (int) Math.random(); 
			hilfsval = (zufallszahlx*zufallszahlx) + (zufallszahly*zufallszahly);
			laenge = Math.sqrt(hilfsval);
			if (laenge <1)
			{
				zaehlerdrin = zaehlerdrin + 1;
			}
			else zaehlerdraussen = zaehlerdraussen + 1;
			
		}
		
		System.out.println ( "PI ist gleich:" + zaehlerdrin/zaehlerdraussen);
	}
}
```

Gruss Mattes


----------



## mattulla (20. Apr 2006)

Das sollte klappen:




```
double laenge = 0;  
	      double zaehlerdrin = 0, zaehlerdraussen = 0;  
	      Random r = new Random();
	      for (int i = 1; i <= 500; i++) 
	      { 
	         laenge = Math.sqrt((Math.pow(r.nextDouble(), 2)) + (Math.pow(r.nextDouble(), 2))); 
	         if (laenge <1) 
	         { 
	            zaehlerdrin++; 
	         } 
	         else 
	         {
	        	 zaehlerdraussen++; 
	         }
	          
	      }
```


----------



## Mattes_01 (20. Apr 2006)

Und wenn es nicht zuviel aufwand macht, wo ist denn genau mein fehler, weil wenn ich mir das so alles ansehe, finde cih das recht logisch, oder nicht ^^

Aber danke schonmal und gruss Mattes


----------



## mattulla (20. Apr 2006)

Klar darfst du fragen: dein Fehler liegt bei den Zufallszahlen....du hast die double-Werte nach int gecastet. Da die double-Werte alle zwischen 0 und 1 liegen und er beim casten einfach abschneidet waren die bei dir alle 0. Somit war auch die laenge immer null und der Zaehler draussen wurde nicht hochgezaehtl und ist 0 geblieben. Daher hattest du dann eine Division durch null.

Dann mussten die beiden Zaehler noch double. Rechnet man int / int kommt da sonst immer eine gerade Zahl raus.

Gruss
mattulla


----------



## Leroy42 (20. Apr 2006)

Der Fehler liegt woanders, Matulla hat nur ein paar Umformungen gemacht die
prinzipiell nichts verändern


			
				Mattes_01 hat gesagt.:
			
		

> ```
> System.out.println ( "PI ist gleich:" + zaehlerdrin/zaehlerdraussen);
> ```


Du bildest das Verhältnis von Innenpunkten zu Außenpunkten.
Richtig ist das Verhältnis von Innenpunkten zu *allen Punkten*

```
System.out.println ( "PI ist gleich:" + (double) zaehlerdrin/(zaehlerinnen+zaehlerdraussen));
```

Außerdem führst du eine Integer-Division durch, brauchst aber eine double-Division.


----------



## Leroy42 (20. Apr 2006)

Sorry @Matulla

Das mit dem double habe ich erst am Ende meines Postings gesehen.
Du hast also *doch* eine _Teil_lösung gepostet


----------



## mattulla (20. Apr 2006)

ist ok....das andere wusste ich nicht, kannte den Algorithmus ansich nicht hatte nur geguckt was da so rein Programmiertechnisch nicht korrekt war.

Hatte mich allerdings auch schon ueber die teils doch recht seltsamen ergebnisse gewundert....nun weiss ich wie sie zustande kommen.


----------



## mattulla (20. Apr 2006)

sorry aber muss dir sagen, dass deins auch nicht so ganz stimmt.....du hast vergessen mit 4 zu multiplizieren


```
System.out.println ( "PI ist gleich:" + (double) zaehlerdrin/(zaehlerinnen+zaehlerdraussen)*4);
```


----------



## Mattes_01 (21. Apr 2006)

Hi!

Also erstmal Danke für eure Antworten!

Also ich habe das ganze jetzt ein bisschen anders gemacht, weil ich, wenn ich ehrlich bin, lieber am nähesten zu meinem ursprünglichen Programm programmiere, bzw dinge verändere, weil ich dann auch verstehe, wo der Fehler ist, z.b. kann ich hiermit rechtwenig anfangen:


```
laenge = Math.sqrt((Math.pow(r.nextDouble(), 2)) + (Math.pow(r.nextDouble(), 2)));
```

Die befehle "Math.pow" habe ich noch nie gehört, und auch das "r.nextDouble()". Denken kann ich mir ja schon, was da gemeint ist, das ist ja ähnlich, wenn man die "SimpleInput"-Klasse verwendet um Zahlen oder so einzulesen.

Naja was ich noch fragen wollte, ob man bei deiner Lösung, matulla, eine zusätzliche Klasse braucht, weil wie gesagt, das sieht für mich ganz dannach aus, auch wegen dieser zeile hier:


```
Random r = new Random();
```



Naja so sieht jetzt mein lauffähiges Programm aus, die Veränderungen, die ich durchführen musste waren nur minimal, danke für eure Hilfe, Gruss Mattes



```
class MonteCarlo
{
	public static void main (String[]args)
	{
		double xkoodrinate = 0, ykoordinate = 0;
		double laenge = 0;
		double hilfsval;
		double zaehlerdrin = 0, zaehlerdraussen = 0;
		int i = 0;
		
		for (i = 1; i <= 5000; i++)
		{
			double zufallszahlx = (double) Math.random(); 
			double zufallszahly = (double) Math.random(); 
			hilfsval = (zufallszahlx*zufallszahlx) + (zufallszahly*zufallszahly);
			laenge = Math.sqrt(hilfsval);
			if (laenge <1)
			{
				zaehlerdrin = zaehlerdrin + 1;
			}
			else zaehlerdraussen = zaehlerdraussen + 1;
			
		}
		
		System.out.println ( "PI ist gleich:" + (zaehlerdrin/(zaehlerdraussen + zaehlerdrin))*4);
	}
}
```


----------



## mattulla (21. Apr 2006)

Die Klasse Random brauchst du nicht zu programmieren du findest sie im Paket java.util
Musst also oben in dem Programm einfach nur die Zeile


```
import java.util.*;
```

enfuegen


Gruss
mattulla


----------

