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
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