Zufälliges Objekt aus der ArraylList ohne java.util.Random

Diskutiere Zufälliges Objekt aus der ArraylList ohne java.util.Random im Java Basics - Anfänger-Themen Bereich.
L

LucaToni

Hallo,

gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
 
mrBrown

mrBrown

Irgendeine Quelle für Zufall musst du schon nutzen, das kann natürlich auch eine andere als Random sein.

Random ist halt mit Abstand das einfachste.
 
T

TM69

Nachtrag:
Code:
public class LinearCongruentialGenerator {

    private int max;
    private int last;

    public static void main(String[] args) {
        SimpleRandom rand = new SimpleRandom(10);

        for (int i = 0; i < 100; i++) {
            System.out.println(rand.nextInteger());
        }

    }

    public LCG(int max){
        this.max = max;
        
        last = (int) (System.currentTimeMillis() % max);
    }
    
    public int nextInteger(){
        last = (last * 32719 + 3) % 32749;
        return last % max;
    }
}
Wie aber schon im Wikipedia geschrieben ist dieses keine echte Zufallszahl, sondern es sieht nur so aus als sei es ein.
 
mrBrown

mrBrown

Er hat nur geschrieben


Also bitte erst lesen, dann schreiben.
Keine Sorge, wie du der ersten Antwort in diesem Thread entnehmen kannst, hab ich seine Frage gelesen.

Das sollte nur ein weiterer Hinweis sein, das es ziemlicher Unsinn ist, auf java.util.Random zu verzichten, wenn es nicht sehr gute Gründe dagegen gibt - und wenn es Gründe gibt, sprechen die meist auch gegen ein (schlechtes) Nachimplementieren von Random.

Es gibt durchaus genügend Dinge an Random, die schlecht gelöst sind, aber die sind in nahezu jeder eigenen Implementierung noch schlechter gelöst, zusätzlich zu anderen Problemen.
 
T

TM69

Keine Sorge, wie du der ersten Antwort in diesem Thread entnehmen kannst, hab ich seine Frage gelesen.

Das sollte nur ein weiterer Hinweis sein, das es ziemlicher Unsinn ist, auf java.util.Random zu verzichten, wenn es nicht sehr gute Gründe dagegen gibt - und wenn es Gründe gibt, sprechen die meist auch gegen ein (schlechtes) Nachimplementieren von Random.

Es gibt durchaus genügend Dinge an Random, die schlecht gelöst sind, aber die sind in nahezu jeder eigenen Implementierung noch schlechter gelöst, zusätzlich zu anderen Problemen.
Da stimme ich dir zu. Aber woher weist du, dass es nicht aus einer Aufgabe stammt und der Dozent bewusst reingeschrieben hat: "Es soll nicht die Klasse java.util.Random benutzt werden"?
 
mrBrown

mrBrown

Aber woher weist du, dass es nicht aus einer Aufgabe stammt und der Dozent bewusst reingeschrieben hat: "Es soll nicht die Klasse java.util.Random benutzt werden"?
Ich weiß es nicht, aber die meisten Dozenten sind zu besseren Aufgaben in der Lage :)

So eine Aufgabe wäre für Anfänger auf keiner Ebene interessant. Interessant wäre es vielleicht im Sinne von „was kann man besser machen als Random“, aber das würde dann nicht hier im Anfänger-Forum landen, und vor allem nicht im Kontext der Verwendung mit ArrayList :)
 
T

TM69

Ich weiß es nicht, aber die meisten Dozenten sind zu besseren Aufgaben in der Lage :)

So eine Aufgabe wäre für Anfänger auf keiner Ebene interessant. Interessant wäre es vielleicht im Sinne von „was kann man besser machen als Random“, aber das würde dann nicht hier im Anfänger-Forum landen, und vor allem nicht im Kontext der Verwendung mit ArrayList :)
Woher willst du

1. Wissen das er ein Anfänger ist?
2. Er z.B. nicht Informatik studiert?

Ich wiederhole mich. Er hat lediglich geschrieben:
gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
und evtl. ist es eine Aufgabe des Dozenten. Ich selber habe als Dozent (im Auftrag meines Profs) an der FH so eine ähnliche Aufgabe damals meinen Studenten gegeben. Allerdings in C++.
 
J

JustNobody

Also der TE hat es als Anfänger Thema einsortiert. Daher ist die Annahme, dass ein Anfänger die Frage aufgeworfen hat doch durchaus gerechtfertigt...

Und wann ist man kein Anfänger mehr? Wenn man in einem Informatik LK 15 Punkte hat? Oder wenn man sich eingeschrieben hat?

In meinen Augen gehört da etwas mehr dazu. Das haben hier genug Leute gut demonstriert.

Und auch bei manchen Aufgabenblättern unterstelle ich dem Ersteller, dass er in Sache Softwareentwicklung ein Anfänger ist.... nicht hier - da kenne ich zu wenig ... der Kontext kann das ja rechtfertigen ... und soqas wirst du bestimmt auch schon gesehen haben ....
 
mrBrown

mrBrown

Schon mal Entschuldigung für das OT, ich hoffe mal der TO hat bereits eine Antwort zu seiner Frage bekommen :)


Woher willst du

1. Wissen das er ein Anfänger ist?
2. Er z.B. nicht Informatik studiert?
Beides weiß ich nicht, ich kann nur aus dem hier bekannten Kontext etwas schlussfolgern :)

Das er Anfänger ist, schließe ich einfach mal aus dem Bereich - "Anfänger-Themen" - in dem wie uns hier befinden und aus der Fragestellung. Jemand mit viel Erfahrung in Java würde sie vermutlich anders stellen (zb den Kontext der ArrayList weglassen; Gründe aufführen, warum Random nicht geeignet ist, ...).

Das er Informatik studiert bzw Java lernt, würde ich einfach mal daraus schließen, dass er im Anfängerforum eine Frage zu Java stellt.

Also Ja, ich gehe davon aus, dass @LucaToni grad im Begriff ist, Java zu lernen, vermutlich im Rahmen eines Studiums :) Falls ich damit falsch liege möge er mich gerne korrigieren :)


und evtl. ist es eine Aufgabe des Dozenten. Ich selber habe als Dozent (im Auftrag meines Profs) an der FH so eine ähnliche Aufgabe meinen Studenten gegeben. Allerdings damals auf C++.
Natürlich kann es eine Aufgabe eines Dozenten sein, nur ist es dann eine sehr schlechte.

Einmal aufgrund des Kontextes mit der ArrayList: Ginge es hauptsächlich um die Implementierung des Zufallszahlen-Generators, wäre das ziemlich sinnlos, stattdessen gäbe es deutlich sinnvollere Möglichkeiten für die Anwendung drum herum. Außerdem kann man durch den Kontext durchaus annehmen, dass die Zufallszahlen-Generierung Teil einer größeren Aufgabe ist. In einer größeren Aufgabe, die offensichtlich die Benutzung von JDK-Klassen erlaubt, einzelne JDK-Klassen, vor allem aus solchen Randgebieten, zu verbieten, ist auch wenig sinnvoll. Sinnvoller wäre in einem solchen Kontext das explizite Fordern der Nutzung vorhandener Klassen - ein typisches Problem ist eben "ich mache alles selber" anstatt eines "Nutz das Vorhandene", mit so einer Aufgabe verstärkt man das dann noch.

Und dazu kommt: die Implementierung eines Zufallszahlen-Generators bringt für sich genommen keinen interessanten Lerneffekt.
  • Es ist kein Modellierungsproblem, auf der Ebene hat man also schon mal keinen Lerneffekt - anders als das typische "Telefonbuch erstellen", "Bank und Konto programmieren", Aufgaben die man hier öfters sieht.
  • Es ist kein interessanter "Algorithmus", der nötig ist. Die ganze Code dahinter ist effektiv ein trivialer Einzeiler, den man von Wikipedia kopieren kann. Man muss uU ein paar Randfälle berücksichtigen, die sind aber eben auf Java-Ebene und grad für Anfänger völlig uninteressant. Eine schönere Aufgabe auf dieser Ebene wäre zB die typische LinkedList, sieht man hier auch oft.
  • Es ist nichts, wo man "schönen Code" lernen könnte, da es eben kaum Code gibt.
  • Das ganze führt nicht zu irgendwelchen Sinnvollen Unit-Tests, da eben kaum Code und man für Zufallszahlen Tests auf ganz andere Ebene braucht.
Im Gesamten sehe ich einfach nicht, wie diese Frage irgendwie für Anfänger interessant sein könnte.


Die Aufgabe kann für Fortgeschrittene durchaus Sinn machen, im Sinne von "wie könnte man die gesamte Random-API anders, besser, modellieren", quasi analog zu "von Date zu java.time" - wenn zB @JustNobody diese Frage gestellt hätte, würde ich so einen Hintergrund erwarten (allerdings würde die Fragestellung dann vermutlich schon eine fertige Lösung beinhalten) - eine Frage auf der Ebene sehe ich hier aber nicht.
 
T

TM69

Also der TE hat es als Anfänger Thema einsortiert. Daher ist die Annahme, dass ein Anfänger die Frage aufgeworfen hat doch durchaus gerechtfertigt...

Und wann ist man kein Anfänger mehr? Wenn man in einem Informatik LK 15 Punkte hat? Oder wenn man sich eingeschrieben hat?

In meinen Augen gehört da etwas mehr dazu. Das haben hier genug Leute gut demonstriert.

Und auch bei manchen Aufgabenblättern unterstelle ich dem Ersteller, dass er in Sache Softwareentwicklung ein Anfänger ist.... nicht hier - da kenne ich zu wenig ... der Kontext kann das ja rechtfertigen ... und soqas wirst du bestimmt auch schon gesehen haben ....
Ein Anfänger ist man immer, wenn man sich weiterbildet / etwas neues lernt. Also insofern gebe ich dir vollkommen Recht @JustNobody
 
T

TM69

Schon mal Entschuldigung für das OT, ich hoffe mal der TO hat bereits eine Antwort zu seiner Frage bekommen :)



Beides weiß ich nicht, ich kann nur aus dem hier bekannten Kontext etwas schlussfolgern :)

Das er Anfänger ist, schließe ich einfach mal aus dem Bereich - "Anfänger-Themen" - in dem wie uns hier befinden und aus der Fragestellung. Jemand mit viel Erfahrung in Java würde sie vermutlich anders stellen (zb den Kontext der ArrayList weglassen; Gründe aufführen, warum Random nicht geeignet ist, ...).

Das er Informatik studiert bzw Java lernt, würde ich einfach mal daraus schließen, dass er im Anfängerforum eine Frage zu Java stellt.

Also Ja, ich gehe davon aus, dass @LucaToni grad im Begriff ist, Java zu lernen, vermutlich im Rahmen eines Studiums :) Falls ich damit falsch liege möge er mich gerne korrigieren :)



Natürlich kann es eine Aufgabe eines Dozenten sein, nur ist es dann eine sehr schlechte.

Einmal aufgrund des Kontextes mit der ArrayList: Ginge es hauptsächlich um die Implementierung des Zufallszahlen-Generators, wäre das ziemlich sinnlos, stattdessen gäbe es deutlich sinnvollere Möglichkeiten für die Anwendung drum herum. Außerdem kann man durch den Kontext durchaus annehmen, dass die Zufallszahlen-Generierung Teil einer größeren Aufgabe ist. In einer größeren Aufgabe, die offensichtlich die Benutzung von JDK-Klassen erlaubt, einzelne JDK-Klassen, vor allem aus solchen Randgebieten, zu verbieten, ist auch wenig sinnvoll. Sinnvoller wäre in einem solchen Kontext das explizite Fordern der Nutzung vorhandener Klassen - ein typisches Problem ist eben "ich mache alles selber" anstatt eines "Nutz das Vorhandene", mit so einer Aufgabe verstärkt man das dann noch.

Und dazu kommt: die Implementierung eines Zufallszahlen-Generators bringt für sich genommen keinen interessanten Lerneffekt.
  • Es ist kein Modellierungsproblem, auf der Ebene hat man also schon mal keinen Lerneffekt - anders als das typische "Telefonbuch erstellen", "Bank und Konto programmieren", Aufgaben die man hier öfters sieht.
  • Es ist kein interessanter "Algorithmus", der nötig ist. Die ganze Code dahinter ist effektiv ein trivialer Einzeiler, den man von Wikipedia kopieren kann. Man muss uU ein paar Randfälle berücksichtigen, die sind aber eben auf Java-Ebene und grad für Anfänger völlig uninteressant. Eine schönere Aufgabe auf dieser Ebene wäre zB die typische LinkedList, sieht man hier auch oft.
  • Es ist nichts, wo man "schönen Code" lernen könnte, da es eben kaum Code gibt.
  • Das ganze führt nicht zu irgendwelchen Sinnvollen Unit-Tests, da eben kaum Code und man für Zufallszahlen Tests auf ganz andere Ebene braucht.
Im Gesamten sehe ich einfach nicht, wie diese Frage irgendwie für Anfänger interessant sein könnte.


Die Aufgabe kann für Fortgeschrittene durchaus Sinn machen, im Sinne von "wie könnte man die gesamte Random-API anders, besser, modellieren", quasi analog zu "von Date zu java.time" - wenn zB @JustNobody diese Frage gestellt hätte, würde ich so einen Hintergrund erwarten (allerdings würde die Fragestellung dann vermutlich schon eine fertige Lösung beinhalten) - eine Frage auf der Ebene sehe ich hier aber nicht.
Da gebe ich dir natürlich Recht, dass so eine Aufgabe eigentlich schlecht ist, allerdings, so war es bei mir damals, als Nicht-Prof (war nur ein einfacher Dozent), die Aufgaben so durchzuführen, wie der Prof es haben will.
 
L

LucaToni

Hallo alle zusammen,

vielen Dank für die Tipps.
ich Klär mal auf bevor ihr euch noch mehr in die Haare kriegt.

1.) Ich bin Anfänger
2.) es ist ein Teil einer Aufgabe, in der man die Lieder einer Playlist zufällig zurückgeben muss und die bereits gespielten Lieder in einer hashset speichern muss.
3.) meine Uni spinnt etwas rum mit den Aufgaben und erwartet echt viel von Informatik für NICHT-INFORMATIKER und es gibt auch Aufgaben in der man Statt fertige Bibliotheken zu nutzen, Code schreiben soll, der die gleiche Funktion erfüllt wie fertige Klassen aus der Java-API... deshalb kam die Frage hier ob es eine Alternative gibt.
4.) Danke allen die mit einem guten Willen an meine Frage ran sind.
 
T

temi

Nachtrag:
Code:
public class LinearCongruentialGenerator {

    private int max;
    private int last;

    public static void main(String[] args) {
        SimpleRandom rand = new SimpleRandom(10);

        for (int i = 0; i < 100; i++) {
            System.out.println(rand.nextInteger());
        }

    }

    public LCG(int max){
        this.max = max;
       
        last = (int) (System.currentTimeMillis() % max);
    }
   
    public int nextInteger(){
        last = (last * 32719 + 3) % 32749;
        return last % max;
    }
}
Wie aber schon im Wikipedia geschrieben ist dieses keine echte Zufallszahl, sondern es sieht nur so aus als sei es ein.
Da hast du aber noch ein paar Hürden eingebaut, oder? Die Klasse heißt anders als ihr Konstruktor und in der main() wird noch eine andere Klasse instantiiert. ;)
 
M

M.L.

Statt fertige Bibliotheken zu nutzen, Code schreiben soll, der die gleiche Funktion erfüllt wie fertige Klassen
Mit so etwas hätten aber auch Informatik-Studierende oder Absolventen ein Problem.... Auf der anderen Seite kann es von Nutzen sein, die Hintergründe dieser oder jener Bibliotheksfunktion/API/... oder das Verhalten der JVM auf der elementaren Ebene zu kennen. Bzgl. Zufall kann radioaktiver Zerfall -neben der Systemzeit- einer näheren Recherche wert sein.
 
T

thecain

Ich würde einfach mal Collections.shuffle einwerfen.

Scheint mir hier vom Niveau und den Anforderungen angebracht. Zumal shuffle bei Playlists auch ein gebräuchlicher Begriff ist.
 
J

JennyL

Wenn ich zur Implementierung etwas nicht verwenden soll, suche ich dazu die bestmögliche oder einfachst mögliche Alternative. Insofern hat @TM69 vollkommen recht. Ich suche nicht nach der abwegigsten Möglichkeit (wie sie mrBrow vorschlägt). Der Prof kann damit überprüfen, wie gut der/die Studierende ihr Wissen bei geänderten Anforderungen übertragen kann. Wenn die Aufgabe lautet, baue ein Auto mit drei Rädern anstatt vier, wird garantiert kein Flugzeug das fährt mit drei Rädern erwartet, obwohl es formal so definiert sein könnte.
 
T

TM69

Da hast du aber noch ein paar Hürden eingebaut, oder? Die Klasse heißt anders als ihr Konstruktor und in der main() wird noch eine andere Klasse instantiiert. ;)
Wenn du kein Prof, so wie ich war, sondern nur vom Dekan (seines Zeichens Prof. Dr. Dr.) beauftragt, hat man das Manuskript / Aufgaben des Profs. einzuhalten. So war es zumindest damals bei mir. Dieses soll allerdings absolut nicht heißen, dass es evtl. an anderen Unis anders ist. Ergänzend dazu sollte ich evtl. erwähnen es waren Studierende des 3. Semesters - sprich noch Anfänger. Natürlich hast du in solchen Kursen immer Leute, die bereits tiefgreifende Erfahrungen hat. Allerdings gebe ich dir zu bedenken, eine Kette ist nur so stark, wie das schwächste Glied.
 
Zuletzt bearbeitet:
Thema: 

Zufälliges Objekt aus der ArraylList ohne java.util.Random

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben