# Kommentierung



## hanno88 (20. Mai 2009)

Hallo, wir sollten folgende Aufgabe lösen:

1. Erstellen Sie ein Java-Programm zur Erzeugung von Pseudozufallszahlen. Implementieren Sie die folgende Vorschrift zur Ermittlung von Pseudozufallszahlen:

zn+1 = a • zn mod m (alles mit ganzen Zahlen)

mit z0 = Systemzeit in Millisekunden, m = 231 und a = 75.

Es gilt 0 <= z < m.

Trick für die Vermeidung großer Zahlen:

zn+1 = a • (zn mod q) - r • (zn / q)
mit q = [m/a] und r = m mod a.

Falls zn+1 negativ ist, muss m addiert werden.

2. Erstellen Sie ein Java-Programm, das zehn Würfe zweier Würfel simuliert und zählen   sie die Pasche. Das Programm soll alle Zahlen strukturiert ausgeben.

3. Erstellen Sie ein Java-Programm, das mit Hilfe von Pseudozufallszahlen Punkte mit den Koordinatenpaaren (x,*y) im Einheitsquadrat (0 <= x <= 1 und 0 <= y <= 1) bestimmt. Berechnen Sie, anhand der Abstände dieser Punkte vom Mittelpunkt des Quadrates, die Prozentzahl der Punkte, die im Einheitskreis liegen, dessen Mittelpunkt mit dem des Quadrates übereinstimmt. Vergleichen Sie die Prozentzahlen für 10, 1000 und 10000 Punkte mit dem bei perfekter Gleichverteilung der Zufallszahlen zu erwartenden Wert. Das Programm soll alle Zahlen strukturiert ausgeben.




Ich bräuchte jetzt mal etwas Hilfe beim kommentieren. Ich weiß nicht, wie genau man das machen muss...

meine Main:

	/**
	 * 
	 * @author XY
	 * @Ort: XY
	 * @e-Mail: XY
	 */

public class PseudoMain
{

	public static void main(String[] args)
	{
		System.out.println("Aufgabe 1:");
		int zeit = (int)(System.currentTimeMillis()%1000*1000);
		System.out.println("W\u00fcrfelzahl: " + PseudoZufallszahlen.wuerfelzahl(
				PseudoZufallszahlen.normierteZahl(
				PseudoZufallszahlen.zufallsZahl(zeit))) + "\n");

		System.out.println("Aufgabe 2:");		
		System.out.println("Anzahl der Pasche: " + PseudoZufallszahlen.zaehlePasche(10)+"\n");

		System.out.println("Aufgabe 3:");
		PseudoZufallszahlen.einheitsKreis(10);
		PseudoZufallszahlen.einheitsKreis(1000);
		PseudoZufallszahlen.einheitsKreis(10000);
	}
}


und die andere:


/**
 * Repräsentiert den Wurf mit zwei Würfeln
 * 
 * @author XY
 * @Ort: XY
 * @e-Mail: XY
 */
public class PseudoZufallszahlen{

	/** */
	static int zufallszahl = (int)(System.currentTimeMillis()%1000*1000);
	static final int a  = (int) Math.pow(7, 5);
	static final int m  = (int) Math.pow(2, 31);
	static final int q  = (int)(m / a);
	static final int r  = (m % a);

	/**
	 * 
	 * @param zeit Die Zeit in Millisekunden
	 * @return gibt eine Ganzzahlige pseudo Zufallszahl zurÃ¼ck
	 */
	public static int zufallsZahl(int zeit)
	{	

		int zufallszahl = ( a * ( zeit % q) - r * ( zeit / q ) );

		if ( zufallszahl < 0 )
		{
			zufallszahl = ( zufallszahl + m );
		}

		return zufallszahl;
	}	

	/**
	 * 
	 * @param zufallsZahl Eine ganzzahlige Zufallszahl
	 * @return Eine aus der Zufallszahl berechnete Zahl
	 */
	public static double normierteZahl(int zufallsZahl)
	{
		return (double)zufallsZahl / m;
	}

	/**
	 * 
	 * @param normierteZahl Eine normierte Zufallszahl generiert aus den vorherigen Methoden
	 * @return Eine Zahl ganze Zahl zwischen 1 und 6
	 */
	public static int wuerfelzahl(double normierteZahl)
	{
		return (int) ( (normierteZahl * 6) + 1 );
	}

	/**
	 * 
	 * @param runden Gibt die Anzahl der Runden an die "gewuerfelt" werden soll
	 * @return gibt die Anzahl der gewuerfelten Pasche zurueck
	 */
	public static int zaehlePasche(int runden) 
	{
		int zufallszahl1, zufallszahl2;
		int anzahlPasche = 0;	

		for (int i = 1; i <= runden; i++) 
		{
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl1 = zufallszahl;
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl2 = zufallszahl;

			int normierteZahl1 = wuerfelzahl(normierteZahl(zufallszahl1));
			int normierteZahl2 = wuerfelzahl(normierteZahl(zufallszahl2));

			System.out.println("Runde "+i+":\n" +
												 "W\u00fcrfelzahlen: [ " + normierteZahl1+" / "+normierteZahl2+" ]\n");

			if (normierteZahl1 == normierteZahl2)
			{
				anzahlPasche++;
			}
		}
		return anzahlPasche;
	}

	/**
	 * 
	 * @param anzahl Gibt die Anzahl der zu generierenden Punkte an
	 */
	public static void einheitsKreis(int anzahl)
	{
		int innerhalbKreis = 0;
		int zufallszahl1, zufallszahl2;

		for (int i = 1; i < anzahl; i++)
		{
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl1 = zufallszahl;
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl2 = zufallszahl;

			double x = normierteZahl(zufallszahl1);
			double y = normierteZahl(zufallszahl2);

			double kathetex = Math.abs(x-0.5);
			double kathetey = Math.abs(y-0.5);
			double hypothenuse = Math.sqrt((kathetex * kathetex) + (kathetey * kathetey));

			if (hypothenuse <= 0.5)
			{
				innerhalbKreis ++;
			}			
		}
		/** Prozentanzahl innerhalb des Kreises*/
		double prozInKreis = (((double)innerhalbKreis/anzahl)*100);

		/** Erwarteter Wert*/
		double erwWert = (((Math.PI)/4)*100);

		/** Abweichung in Prozent die nicht im Kreis liegen*/
		double abweichung = prozInKreis-erwWert;

		System.out.printf("\n\nVon "+anzahl+" Punkten liegen %.3f Prozent innerhalb des Einheitskreises. \n" +
												"Der zu erwartende Wert liegt bei %.3f Prozent. \n" +
														"Das entspricht einer Abweichung von %.3f Prozent", prozInKreis, erwWert, abweichung);
	}
}



ich hab zwar schon ein bisschen angefangen zu kmmentieren, aber ich würde mich über ein paar hilfreiche Beiträge freuen, was ich wo WIE kommentieren soll.

Danke


----------



## madboy (20. Mai 2009)

Normalerweise wird jede Methode mit einem Javadoc-Kommentar versehen. Darin wird kurz beschrieben, WAS die Methode tut und nur in seltenen Fällen auch, WIE die Methode das tut.

Jede Klasse bekommt auch einen Kommentar mit einer Beschreibung, was die Klasse tut und evtl. was man bei der Verwendung beachten muss (threadsafe oder nicht usw.)

Innerhalb von Methoden werden komplizierte Konstrukte kommentiert, wie zum Beispiel lange und/oder komplexe reguläre Ausdrücke.

Javadoc-Kommentare sind die mit zwei Sternchen, also /**blabla*/
Innerhalb von Methoden oder für sonstige Kommentare wird // oder für Kommentarblöcke /**/ verwendet.

Keine Garantie auf Korrektheit 

P.S.: schau dir mal ein paar Javaklassen an (java.lang.String z.B.). Das sind zwar teilweise auch keine Schulbuchkommentare aber um ein Gefühl für Kommentare zu bekommen sollte das passen


----------



## Landei (22. Mai 2009)

PS: Quelltext hier im Forum wird erst durch [java] schön.


----------



## hanno88 (22. Mai 2009)

Also abgegeben hab ichs jetzt so:
Main:


```
/**
	 * 
	 * @author XY
	 * @Ort: ...
	 * @e-Mail: XY
	 */

public class PseudoMain {
	
	
	 /** @param args Parameterliste
	 */
	public static void main(String[] args) {
		
		/**Startet ein Programm zur Erzeugung einer Pseudo-Zufallszahl zwischen 1 und 6.*/
		System.out.println("Uebungsaufgabe 1:");
		int zeit = (int)(System.currentTimeMillis()%1000*1000);
		System.out.println("W\u00fcrfelzahl: " + PseudoZufallszahlen.wuerfelzahl(
				PseudoZufallszahlen.normierteZahl(
				PseudoZufallszahlen.zufallsZahl(zeit))) + "\n");
		
		/** Startet ein Programm welches zehn würfe mit Würfeln generiert und die Anzahl der Pasche zählt.*/
		System.out.println("Uebungsaufgabe 2:");		
		System.out.println("Anzahl der Pasche: " + PseudoZufallszahlen.zaehlePasche(10)+"\n");
		
		/**Startet ein Programm zur Errechnung von Punkten innerhalb eines Koordinatensystems und gibt einen erwarteten Wert in Prozent aus.*/
		System.out.println("Uebungsaufgabe 3:");
		PseudoZufallszahlen.einheitsKreis(10);
		PseudoZufallszahlen.einheitsKreis(1000);
		PseudoZufallszahlen.einheitsKreis(10000);
	}
}


Class:

/**
 * 
 * @author XY
 * @Ort: ....
 * @e-Mail: XY
 */

/*Aufgabe 1*/

public class PseudoZufallszahlen{
	
	/** erstellt eine Pseudo-Zufallszahl mit Hilfe von der Systemzeit in Millisekunden*/
	
	static int zufallszahl = (int)(System.currentTimeMillis()%1000*1000);
	static final int a  = (int) Math.pow(7, 5);
	static final int m  = (int) Math.pow(2, 31);
	static final int q  = (int)(m / a);
	static final int r  = (m % a);

	/**
	 * @param zeit Die Zeit in Millisekunden
	 */
	public static int zufallsZahl(int zeit)
	{	

		int zufallszahl = ( a * ( zeit % q) - r * ( zeit / q ) );

		if ( zufallszahl < 0 )
		{
			zufallszahl = ( zufallszahl + m );
		}
		
		/** Gibt eine ganzzahlige pseudo-Zufallszahl zurück*/
		return zufallszahl;
	}	

	/*Aufgabe 2*/
	
	/** Programm zur Simulierung von würfen mit zwei Würfeln.
	 * 
	 * @param zufallsZahl Eine ganzzahlige Zufallszahl	 */
	public static double normierteZahl(int zufallsZahl)
	{
		/**Gibt eine aus der Zufallszahl berechnete Zahl zurück*/
		return (double)zufallsZahl / m;
	}

	 /** @param normierteZahl Eine normierte Zufallszahl generiert aus den vorherigen Methoden*/
	public static int wuerfelzahl(double normierteZahl)
	{
		/**Gibt eine ganze Zahl zwischen 1 und 6 wieder*/
		return (int) ( (normierteZahl * 6) + 1 );
	}

	 /** @param runden Gibt die Anzahl der Runden an die "gewuerfelt" werden soll*/
	public static int zaehlePasche(int runden) 
	{
		int zufallszahl1, zufallszahl2;
		int anzahlPasche = 0;	

		for (int i = 1; i <= runden; i++) 
		{
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl1 = zufallszahl;
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl2 = zufallszahl;
			
			int normierteZahl1 = wuerfelzahl(normierteZahl(zufallszahl1));
			int normierteZahl2 = wuerfelzahl(normierteZahl(zufallszahl2));
			
			System.out.println("Runde "+i+":\n" + "W\u00fcrfelzahlen: [ " + normierteZahl1+" / "+normierteZahl2+" ]\n");
			
			/** Wenn zwei Zahlen gleich sind, wird die Anzahl der Pasche um 1 erhöht.*/
			if (normierteZahl1 == normierteZahl2)
			{
				anzahlPasche++;
			}
		}
		/** Gibt die Anzahl der Pasche zurück*/
		return anzahlPasche;
	}

	
	/*Aufgabe 3*/
	/**Programm zur Berechnung von Punkten im Koordinatensystem, welche innerhalb des Einheitskreises liegen und 
	 * gibt den zu erwartenden Wert in Prozent aus, wie es bei perfekter Gleichverteilung aussehe.
	 * 
	 * @param anzahl Gibt die Anzahl der zu generierenden Punkte an
	 */
	public static void einheitsKreis(int anzahl)
	{
		int innerhalbKreis = 0;
		int zufallszahl1, zufallszahl2;

		for (int i = 1; i < anzahl; i++)
		{
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl1 = zufallszahl;
			zufallszahl = zufallsZahl(zufallszahl);
			zufallszahl2 = zufallszahl;
			
			double x = normierteZahl(zufallszahl1);
			double y = normierteZahl(zufallszahl2);

			double kathetex = Math.abs(x-0.5);
			double kathetey = Math.abs(y-0.5);
			double hypothenuse = Math.sqrt((kathetex * kathetex) + (kathetey * kathetey));
			
			if (hypothenuse <= 0.5)
			{
				innerhalbKreis ++;
			}			
		}
		/** Prozentanzahl innerhalb des Kreises*/
		double prozInKreis = (((double)innerhalbKreis/anzahl)*100);
		
		/** Erwarteter Wert*/
		double erwWert = (((Math.PI)/4)*100);
		
		/** Abweichung in Prozent die nicht im Kreis liegen*/
		double abweichung = prozInKreis-erwWert;
			
		System.out.printf("\n\nVon "+anzahl+" Punkten liegen %.3f Prozent innerhalb des Einheitskreises. \n" 
				+ "Der zu erwartende Wert liegt bei %.3f Prozent. \n" 
				+ "Das entspricht einer Abweichung von %.3f Prozent", prozInKreis, erwWert, abweichung);
	}
}
```


----------



## hanno88 (22. Mai 2009)

Darauf aufbauent sollen wir jetzt folgende Aufgabe machen. (Tut mir leid, dass ich so viel Frage, aber das is alles noch Neuland...)

1. Lagern Sie Ihre Methoden zur Erzeugung von Pseudozufallszahlen – falls noch nicht geschehen – in eine eigene Java-Klasse aus.

2. Programmieren Sie ein Java-Applet, das die Punkteverteilung aus Übung 2 – Aufgabe*3 für 100000 Punkte darstellt. Wählen Sie dazu eine Größe des Applets von 500 x 500 Bildpunkten und nutzen Sie diese Fläche vollständig für das Quadrat aus.

3. Programmieren Sie ein Java-Applet, das nach der Betätigung eines Buttons zwei nebeneinanderliegende Würfel mit pseudozufällig ermittelten Augenzahlen darstellt. Verwenden Sie dazu die Klassen java.applet.Applet, java.awt.Graphics und java.awt.Button. Wenn ein Pasch vorliegt, soll dies als Hinweistext ausgegeben werden.


Was bedeutet Aufgabe 1? habe ich das nicht schon gemacht?
Und zu 2... kann mir jemand sagen, wie ich ein Applet erstellen kann, das 2 Quadrate erzeugt werden und ich da würfelaugen reinbekomme? also da fehlt mir jeglicher Ansatz 

Ich weiß zwar wie ich ein Applet erstelle, aber nicht wie ich da Würfelaugen reinbringen kann. Könnte mir vorstellen, dass ich irgendwie ne Rechnung machen muss, die zur Mitte des Quadrats führt , aber da raucht mir grad der Kopf ^^


----------



## Landei (23. Mai 2009)

Zu 1.: Nicht ganz: Du hast zwar eine Klasse PseudoZufallszahlen, aber da ist Zeug drinne, was damit eigentlich nichts zu tun hat. Eigentlich sollte sie nur die Methoden zufallszahl und normierteZufallszahl enthalten, alles andere ist zu "speziell". Schau dir z.B. die Java-Klasse Random an, die etwas ähnliches macht: Da sind ist auch keine zaehlePasche Methode oder so drin, sondern wirklich nur Kram, der mit der Erzeugung von Zufallszahlen zu tun hat. Soll heißen: Splitte deine Klasse in eine allgemein verwendbare und in eine für deine spezielle Aufgabe (mit Würfeln und so). Stichwort: Separation of Concerns.


----------

