Zufallszahl-Generatoren (Schnittstellen)

sengul

Bekanntes Mitglied
Hallo gemeinsam,
ich versuche folgende aufgabe zu lösen, aber weiss nicht wie. Ich habe die Klasse Zufallszahl geschrieben, wo im Konstruktor für jedes Object ein Random zahl erzeugt wird. Diese Klasse Zufallszahl und ihre funktionalitat findet ihr hier http://www.java-forum.org/thema/zufallszahl-statische-attribute-und-methoden.176009/

Nun gibt es eine fortsetzung dieser aufgabe und da heisst es:
Erweitern Sie Ihre Klasse Zufallszahl aus Aufgabe 2 um die Unterstützung für verschiedene Zufallszahl-Generatoren. Erstellen Sie dazu eine Schnittstelle ZufallszahlGenerator, die eine Methode zur Berechnung einer Zufallszahl definiert. Erstellen Sie anschließend mindestens zwei verschiedene Klassen, die diese Schnittstelle implementieren und auf jeweils unterschiedliche Weise eine Zufallszahl erzeugen. Eine mögliche Implementierung können Sie aus Aufgabe 2 übernehmen, die Zufälligkeit der erzeugten Zahlen steht aber bei dieser Aufgabe nicht im Vordergrund (beispielsweise könnte Ihre Implementierung auch stets die gleiche „Zufallszahl“ 42 zurückliefern). Ändern Sie nun die Klasse Zufallszahl so ab, das sie die Berechnung der Zufallszahl an eine beliebige, die Schnittstelle ZufallszahlGenerator implementierende Klasse delegiert. Welche konkrete Implementierung zum Einsatz kommt, soll dabei zur Laufzeit festgelegt und geändert werden können.

Ich weiss nicht wie ich nun die klasse zur zufallszahlen rufen soll und wo ich es rufen soll? Ich verstehe einfach diesen Satz nicht "..das sie die Berechnung der Zufallszahl an eine beliebige, die Schnittstelle ZufallszahlGenerator implementierende Klasse delegiert. " Kann mir das jemand erklaren, was hier gemeint ist.
Das was ich gemacht habe hange ich unten ran.

Schnittstelle ZufallszahlGenerator
Java:
package ubungsblatt;

public interface ZufallszahlGenerator {
 
    public int zufallszahl();

}
Klasse ImplementZahlOne
Java:
package ubungsblatt;

import java.util.Random;

public class ImplementZahlOne implements ZufallszahlGenerator{

    @Override
    public int zufallszahl() {
        Random random = new Random();
        int randomNumber = random.nextInt(100);
        System.out.println("In der Klasse ImplementZahlOne");
        return randomNumber;
    }
}
Klasse ImplementZahlTwo
Java:
package ubungsblatt;

import java.util.ArrayList;
import java.util.Random;

public class ImplementZahlTwo implements ZufallszahlGenerator {

    @Override
    public int zufallszahl() {
        int size = 100;
        ArrayList<Integer> list = new ArrayList<Integer>(size);

        for (int i = 1; i <= size; i++) {
            list.add(i);
        }
        Random rand = new Random();
        int index = rand.nextInt(list.size());
        int x = list.get(index);
        System.out.println("In der Klasse ImplementZahlTwo");
        return x;
    }
}

Klasse Zufallszahl
Java:
package ubungsblatt;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Zufallszahl{

    public final int nummer;
    public final int randomNumber;
    private static int count = 0;

    public Zufallszahl() {
        count++;
        this.nummer = count;
        Random random = new Random();
        int randomNumber = random.nextInt(100);
        this.randomNumber = randomNumber;
    }

    public int getRandomNumber() {
        return randomNumber;
    }

    public static int getCount() {
        return count;
    }

    public static int groesteZahl(Zufallszahl... params) {
        int max = 0;

        for (Zufallszahl o : params) {
            if (max < o.getRandomNumber()) {
                max = o.getRandomNumber();
            }
        }
        return max;
    }

    public static Zufallszahl groesteZufallsObjekt(int max, Zufallszahl... params) {
        Zufallszahl p = null;
        for (Zufallszahl o : params) {
            if (max == o.getRandomNumber()) {
                p = o;
            }
        }
        return p;
    }

    public static int grosteZahl(List<Integer> list) {
        int x = Collections.max(list);
        return x;
    }

    public static void main(String[] args) {

        Zufallszahl z = null;
        int max = 0;
        Zufallszahl z1 = new Zufallszahl();
        Zufallszahl z2 = new Zufallszahl();
        Zufallszahl z3 = new Zufallszahl();
        Zufallszahl z4 = new Zufallszahl();
        Zufallszahl z5 = new Zufallszahl();
        Zufallszahl z6 = new Zufallszahl();

        List<Integer> list = new ArrayList<>();
        list.add(z1.getRandomNumber());
        list.add(z2.getRandomNumber());
        list.add(z3.getRandomNumber());
        list.add(z4.getRandomNumber());
        list.add(z5.getRandomNumber());
        list.add(z6.getRandomNumber());

        System.out.println("Zufalszahl:\t" + z1.getRandomNumber());
        System.out.println("Zufalszahl:\t" + z2.getRandomNumber());
        System.out.println("Zufalszahl:\t" + z3.getRandomNumber());
        System.out.println("Zufalszahl:\t" + z4.getRandomNumber());
        System.out.println("Zufalszahl:\t" + z5.getRandomNumber());
        System.out.println("Zufalszahl:\t" + z6.getRandomNumber());
        System.out.println();
        System.out.println("Zufalszahl:\t" + z1.nummer);
        System.out.println("Zufalszahl:\t" + z2.nummer);
        System.out.println("Zufalszahl:\t" + z3.nummer);
        System.out.println("Zufalszahl:\t" + z4.nummer);
        System.out.println("Zufalszahl:\t" + z5.nummer);
        System.out.println("Zufalszahl:\t" + z6.nummer);
        System.out.println();
        System.out.println("Anzahl der erzeugten objecte:\t" + getCount());
        max = groesteZahl(z1, z2, z3, z4, z5, z6);
        System.out.println("Grösste Zufallszahl:\t" + max);
        z = groesteZufallsObjekt(max, z1, z2, z3, z4, z5, z6);
        System.out.println("Nummer des Objects mit dem grössten Zufallszahl:\t" + z.nummer);
        System.out.println("Grösste Zufallszahl:\t" + grosteZahl(list));
       
        ZufallszahlGenerator one = new ImplementZahlOne();
        ZufallszahlGenerator two = new ImplementZahlTwo();
        System.out.println();
        System.out.println(one.zufallszahl());
        System.out.println(two.zufallszahl());
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Gemeint ist, statt in Zufallszahl Random.nextInt zum erhalten der Zahlen zu benutzen, ZufallszahlGenerator.zufallszahl zu nutzen, und die entsprechende Instanz während der Laufzeit festzulegen, diese also nicht in Zufallszahl zu erzeugen
 

sengul

Bekanntes Mitglied
Jetzt verstehe ich was gemeint ist, aber wenn ich keine instanz in der Klasse Zufallszahl erzeuge, wie kann ich dann auf die methode zufallszahl() zugreifen, muss ich die methode im interface dann static machen, denn ich bekomme in dem unten aufgeführten code eine fehlermeldung, dass die methode static sein soll.

Konstruktor der Klasse Zufallszahl
Java:
public class Zufallszahl{

    public final int nummer;
    public final int randomNumber;
    private static int count = 0;

    public Zufallszahl() {
        count++;
        this.nummer = count;
        this.randomNumber =       ZufallszahlGenerator.zufallszahl();  
    }
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Du kannst der Klasse einfach eine Instanz von ZufallszahlGenerator übergeben, static ist genau der falsche Weg.
 

sengul

Bekanntes Mitglied
Du meinst es wahrscheinlich so wie unten

Java:
    public Zufallszahl() {
        count++;
        this.nummer = count;
        ZufallszahlGenerator neu = null;
        this.randomNumber =   neu.zufallszahl();
        System.out.println("Im Konstruktor ist der Zufallszahl:" + randomNumber );
     
    }

aber wenn ich es so mache dann bekomme einen NullPointerException Fehler beim compilieren.
Diese fehler taucht genau hier auf this.randomNumber = neu.zufallszahl();
 
Zuletzt bearbeitet:

stg

Top Contributor
Bennen deine Methoden, Klassen und Variablen doch mal anständig, da wird man beim Lesen ja rammdösig!!

Zm Problem:
Der Client, welcher den Zufallsgenerator benutzen soll (also in deinem Fall die Klasse Zufallszahl) bekommt einfach ein Attribut vom Typ ZufallszahlGenerator und eine passende setter-Methode. In der Klasse Zufallszahl erstellst du nirgends einen konkreten ZufallszahlGenerator, sondern setzt ihn von außen durch die setter Methode. Insbesondere wird so auch der letzte Punkt der Aufgabenstellung berücksichtigt.
 

JAVAKEK

Mitglied
Ein setter reicht hier nicht. Der Konstruktor braucht hier auch noch ein parameter vom typ ZufallszahlGenerator, da ja anscheinend dort schon die generierung gebraucht wird.
 

mrBrown

Super-Moderator
Mitarbeiter
Setter ist auch überflüssig, weil die zufällige Zahl nur im Konstruktor generiert werden muss, der Generator muss nicht mal Instanzvariable sein
 

stg

Top Contributor
Da habt ihr wohl recht, so genau hab ich's dann doch nicht gelesen :oops:
Welche konkrete Implementierung zum Einsatz kommt, soll dabei zur Laufzeit [...] geändert werden können.
Davon hatte ich mich verleiten lassen. Aber wenn man den ersten Teil der Aufgabe noch mit liest, dann wrd klar, was gemeint war.
 

sengul

Bekanntes Mitglied
Sorry ich verstehe doch nicht diese aufgabe, kann mir jemand dass mit einem beispiel erklaren wie ich es machen soll?
Die stelle wo der zufallszahl erzeugt wird ist egal
 

JAVAKEK

Mitglied
Konstruktor anpassen:
Java:
    public Zufallszahl(ZufallszahlGenerator gen) {
        count++;
        this.nummer = count;
        this.randomNumber = gen.zufallszahl();
    }
 

sengul

Bekanntes Mitglied
Um den Konstruktor anzupassen, muss ich ihm doch einen parameter geben vom typ ZufallszahlGenerator(Interface) , und das geht doch nicht da ich keine Instanz von einer Schnitstelle erzeugen kann oder bin ich falscher meinung? Und wenn ich eine Instanz erzeuge wie unten, dann habe ich doch dem compiler gesagt welcher Implementation er nehmen soll, aber genau das soll ja nicht sein, den es soll wahrend der laufzeit bestimmt werden welcher implementation genommen werden soll.

Java:
 ZufallszahlGenerator one = new ImplementZahlOne();
 

JAVAKEK

Mitglied
Um den Konstruktor anzupassen, muss ich ihm doch einen parameter geben vom typ ZufallszahlGenerator(Interface)
jo
, und das geht doch nicht da ich keine Instanz von einer Schnitstelle erzeugen kann oder bin ich falscher meinung? Und wenn ich eine Instanz erzeuge wie unten, dann habe ich doch dem compiler gesagt welcher Implementation er nehmen soll, aber genau das soll ja nicht sein, den es soll wahrend der laufzeit bestimmt werden welcher implementation genommen werden soll.
Java:
 ZufallszahlGenerator one = new ImplementZahlOne();

Wer sagt den, dass du eine neue Instanz von einem Intefrace erstellen musst. Klar musst du, wie du in deinem Codeausschnitt schon richtig stehen hast, irgendwo eine Instanz erstellen und klar definieren welche Implementierung nun benutzt werden soll.
Das wichtige bei der Aufagebe ist die Klasse ZufallsZahl. Zur Laufzeit weiß die Klasse Zufallszahl nicht was sich nun hinter dem Parameter verbrigt. Es kann nun ImplementZahlOne oder auch ImplementZahlTwo sein. ZufallsZahl sieht aber nur das Interface und ruft ganz dumm zufallszahl() auf und die eigentliche Implementierung gibt hoffentlich was zurück.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Immer dieselbe Zufallszahl Java Basics - Anfänger-Themen 4
M Zufallszahl generieren mit einer linken und rechten Grenze Java Basics - Anfänger-Themen 3
J for Schleife kleinste Zufallszahl finden Java Basics - Anfänger-Themen 25
S Zufallszahl mit Wahrscheinlichkeit Java Basics - Anfänger-Themen 13
brypa Zufallszahl Java Basics - Anfänger-Themen 9
C Zufallszahl + Werte bereich einstellen Java Basics - Anfänger-Themen 2
N Bereich Zufallszahl bestimmen (50 und 100 / 80 und 90) Java Basics - Anfänger-Themen 2
J Zufallszahl funktioniert nicht Java Basics - Anfänger-Themen 27
E Zufallszahl mit Wahrscheinlichkeit Java Basics - Anfänger-Themen 4
T Random soll Zufallszahl beibehalten. Java Basics - Anfänger-Themen 11
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
D Zufallszahl zwischen 10 und 99? Java Basics - Anfänger-Themen 5
M Vierstellige Zufallszahl Java Basics - Anfänger-Themen 3
B Methoden Per Buttonklick eine Zufallszahl in ein Numberfield geben Java Basics - Anfänger-Themen 2
S Zufallszahl (Statische Attribute und Methoden) Java Basics - Anfänger-Themen 10
M Erste Schritte Zufallszahl Spiel Problem Java Basics - Anfänger-Themen 7
N Zufallszahl beim Eintragen Java Basics - Anfänger-Themen 2
B Methoden Die Sache Mit der Zufallszahl Java Basics - Anfänger-Themen 3
I immer die gleiche Zufallszahl Java Basics - Anfänger-Themen 9
F Zufallszahl ohne Wiederholung Java Basics - Anfänger-Themen 7
R Zufallszahl Java Basics - Anfänger-Themen 5
P Typecasting für Ganzzahlige Zufallszahl (Math.random) Java Basics - Anfänger-Themen 2
S Zufallszahl erzeugen in 50er Schritten Java Basics - Anfänger-Themen 2
S Gerade bzw. Ungerade Zufallszahl generieren Java Basics - Anfänger-Themen 5
P Erste Schritte Zufallszahl in Ascii-Code umwandeln ?!? Java Basics - Anfänger-Themen 6
M Exception bei Zufallszahl Java Basics - Anfänger-Themen 15
M neue Zufallszahl in Schleife Java Basics - Anfänger-Themen 2
TheKing Zufallszahl die man durch 15 dividieren kann Java Basics - Anfänger-Themen 6
Luk10 Zufallszahl "ohne" eine bestimmte Zahl(en) Java Basics - Anfänger-Themen 8
N zufallszahl Java Basics - Anfänger-Themen 3
D Java Zufallszahl Java Basics - Anfänger-Themen 5
N Zufallszahl Java Basics - Anfänger-Themen 2
A Eingabe und Zufallszahl Java Basics - Anfänger-Themen 12
S Zufallszahl -> Schleife Java Basics - Anfänger-Themen 10
TheKing ZufallsZahl im negativbereich Java Basics - Anfänger-Themen 2
S Zufallszahl mit 6 Stellen erzeugen Java Basics - Anfänger-Themen 4
D bei Zufallszahl immer 2 Java Basics - Anfänger-Themen 12
K Zufallszahl Java Basics - Anfänger-Themen 4
Z Alle 15 sek eine Zufallszahl auf Bildschirm Java Basics - Anfänger-Themen 10
M Zufallszahl - kleine Frage Java Basics - Anfänger-Themen 4
S Zufallszahl Java Basics - Anfänger-Themen 9
I Zufallszahl ziwschen 0 und 7 Java Basics - Anfänger-Themen 3
F Zufallszahl in einem bestimmten Intervall Java Basics - Anfänger-Themen 9
B Befehl zum erstellen einer Zufallszahl. Java Basics - Anfänger-Themen 8
S 4-stellige Zufallszahl Java Basics - Anfänger-Themen 4
P Methode funzt nicht => Zufallszahl darf nicht 2x erschein Java Basics - Anfänger-Themen 4
M zufallszahl ohne doppelvorkommen Java Basics - Anfänger-Themen 2
H Zufallszahl Java Basics - Anfänger-Themen 2
K [Java] Zufallszahl als ganze Zahl Java Basics - Anfänger-Themen 5
G Zufallszahl zwischen 2 und n Java Basics - Anfänger-Themen 10
R Zufallszahl random Java Basics - Anfänger-Themen 8
E zufallszahl zwischen 1 und 6 Java Basics - Anfänger-Themen 6
J eigene methode erstellen die eine Zufallszahl generiert. Java Basics - Anfänger-Themen 12
J Zufallszahl ohne Math.random Java Basics - Anfänger-Themen 4
S Spiel: Wer ist näher an der Zufallszahl? Java Basics - Anfänger-Themen 4
N Überprüfung der ZufallsZahl? Java Basics - Anfänger-Themen 2
S Zufallszahl ermitteln Java Basics - Anfänger-Themen 2
C Zufallszahl zwischen... Java Basics - Anfänger-Themen 10
H zufallszahl Java Basics - Anfänger-Themen 2
Z Gesamtleistung bei Generatoren Java Basics - Anfänger-Themen 23
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
Fragerjava Java Schnittstellen Java Basics - Anfänger-Themen 6
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
N Generische Schnittstellen Java Basics - Anfänger-Themen 2
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
Helgon Interface Runnable Frage / Schnittstellen allgemein Java Basics - Anfänger-Themen 3
S ich begreife es einfach nicht -> zweck der Schnittstellen Java Basics - Anfänger-Themen 27
D Interfaces / Schnittstellen Java Basics - Anfänger-Themen 8
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
G Schnittstellen Programmierung Java Basics - Anfänger-Themen 5
G in Java mit Schnittstellen arbeiten Java Basics - Anfänger-Themen 5
G Nutzen von Schnittstellen Java Basics - Anfänger-Themen 14
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
E Schnittstellen und Objekte in komplizierter Form Java Basics - Anfänger-Themen 10
E Wozu dienen Schnittstellen? Java Basics - Anfänger-Themen 16
G schnittstellen Java Basics - Anfänger-Themen 4
Y Frage zu Schnittstellen Java Basics - Anfänger-Themen 17
C Schnittstellen ???? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben