Du könntest einen Kongruenzgenerator https://de.wikipedia.org/wiki/Kongruenzgenerator verwenden.Hallo,
gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
zB java.util.RandomDu könntest einen Kongruenzgenerator https://de.wikipedia.org/wiki/Kongruenzgenerator verwenden.
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;
}
}
Er hat nur geschriebenzB java.util.Random
gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen
Keine Sorge, wie du der ersten Antwort in diesem Thread entnehmen kannst, hab ich seine Frage gelesen.Er hat nur geschrieben
Also bitte erst lesen, dann schreiben.
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"?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.
Ich weiß es nicht, aber die meisten Dozenten sind zu besseren Aufgaben in der LageAber 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"?
Woher willst duIch 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
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++.gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
Beides weiß ich nicht, ich kann nur aus dem hier bekannten Kontext etwas schlussfolgernWoher willst du
1. Wissen das er ein Anfänger ist?
2. Er z.B. nicht Informatik studiert?
Natürlich kann es eine Aufgabe eines Dozenten sein, nur ist es dann eine sehr schlechte.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++.
Ein Anfänger ist man immer, wenn man sich weiterbildet / etwas neues lernt. Also insofern gebe ich dir vollkommen Recht @JustNobodyAlso 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 ....
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.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.
Im Gesamten sehe ich einfach nicht, wie diese Frage irgendwie für Anfänger interessant sein könnte.
- 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.
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 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.Nachtrag:
Wie aber schon im Wikipedia geschrieben ist dieses keine echte Zufallszahl, sondern es sieht nur so aus als sei es ein.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; } }
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.Statt fertige Bibliotheken zu nutzen, Code schreiben soll, der die gleiche Funktion erfüllt wie fertige Klassen
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.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.
Er meinte deinen Beispielcode hier im Thread, nicht irgendeine Aufgabe die du vielleicht irgendwannmal gestellt hast.Wenn du kein Prof, so wie ich war, sondern nur vom Dekan (seines Zeichens Prof. Dr. Dr.) beauftragt war, 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.
Ok, ich hatte es auf mich bezogen, weil er mich erwähnt hatte.Er meinte deinen Beispielcode hier im Thread, nicht irgendeine Aufgabe die du vielleicht irgendwannmal gestellt hast.
Das war auch auf dich bezogen, der Code, den er extra zitiert hat, ist schließlich von dir gepostet worden...Ok, ich hatte es auf mich bezogen, weil er mich erwähnt hatte.
Dann verstehe ich gerad nicht was du von mir willstDas war auch auf dich bezogen, der Code, den er extra zitiert hat, ist schließlich von dir gepostet worden...
Dann verstehe ich gerad nicht was du von mir willst
public class LinearCongruentialGenerator { // "LinearCongruentialGenerator"
public static void main(String[] args) {
SimpleRandom rand = new SimpleRandom(10); // "SimpleRandom"
}
public LCG(int max){ // "LCG"
}
}
!!! Ich denke auch, dass das die Variante ist, die der Prof anpeilt. Also Liste shufflen (deutsch: mischen), dann Element an Index 0 zurückliefern.Ich würde einfach malCollections.shuffle
einwerfen.
//Habe eine HashSet mit den bereits gespielten Liedern. Die ist leer am Anfang
//Hashset name ist absgepsielt
//ich möchte ein Lied zufällig wiedergeben, dafür erstelle ich mit Random eine ganzzahl
//die zufällige ganzzahl ist abspieleNr.
//Ich möchte das abgepsielte Lied in meine Hashset hinzufügen und dann das zufällige
//lied zurückgeben.
public Musikliste shuffle()
{
Random titelNr=new Random();
int abspieleNr=titelNr.nextInt(lieder.size());
if(abgespielt.containsAll(lieder))
{abgespielt.clear();}
abgespielt.add(lieder.get(abspieleNr));
return lieder.get(abspieleNr);
}
//ich möchte ein Lied zufällig wiedergeben, dafür erstelle ich mit Random eine ganzzahl
//die zufällige ganzzahl ist abspieleNr.
//Ich möchte das abgepsielte Lied in meine Hashset hinzufügen und dann das zufällige
//lied zurückgeben.
Warum willst du ein Lied aus dem HashSet bekommen - deinem Code und deiner Erklärung nach willst du etwas in das Set legen?
Das kann man doch einfach der Reihe nach abarbeiten:
* zufällige Nummer generieren
* Lied zu der Nummer raussuchen
* Lied in das Set legen
* Lied zurückgeben
Prüf doch einfach ob es schon im Set liegt, wenn du das vermeiden willst?Das gelegte wieder zurückbekommen, da ja in einem Set keine Duplikate vorhanden sein können dachte ich wäre es die beste Lösung, damit ich kein Lied doppelt abspiele.
verstehe ich nicht.Prüf doch einfach ob es schon im Set liegt, wenn du das vermeiden willst?
Oder entfern jedes schon gespielte aus der Liste der noch zu spielenden Lieder.
Wie mache ich das?- Du wählst so lange ein neues Lied aus, bis das gewählte Lied nicht in abgespielt ist. Hier würde sich eine do/while Schleife anbieten.
Ich hab ja ein Return mit dem Objekttyp Lied.... wie kann ich denn die Elemente der Hashset entsprechend zurückgeben?do
LiedAuswählen
while(gewähltes Lied in gespielt);
Das wäre der Pseudocode.
Trenn dich von der Idee, irgendwas aus dem HashSet zu holen.wie kann ich denn die Elemente der Hashset entsprechend zurückgeben?
Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!Trenn dich von der Idee, irgendwas aus dem HashSet zu holen.
Du brauchst das Set nur, um Dinge reinzulegen und um zu prüfen, ob etwas drin ist.
Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!
einfach hashset.get<key> wäre doch viel besser, wie bei Listen. Jetzt muss ich mir überlegen wie ich das lösen kann.
Mit do....while geht es nicht so wie ich es will.... oder ich bekomme das nicht so hin.
Was ist mit einem Iterator? Kann man damit die Elemente rausholen?
Erstmal: ein HashSet kennt keine Keys, es kennt nur die Elemente, die dann auch enthalten sind.Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!
einfach hashset.get<key> wäre doch viel besser, wie bei Listen. Jetzt muss ich mir überlegen wie ich das lösen kann.
return hashSet.get(xy);
kannst du also genauso einfach return xy;
nutzen - die beiden sind gleichwertig.Vermutlich letzteres, zeig doch mal deinen Code.Mit do....while geht es nicht so wie ich es will.... oder ich bekomme das nicht so hin.
Ja, kann man. Und Nein, das ist in diesem Fall nicht sinnvoll. Das Element, welches du rausholen willst, hast du schon.Was ist mit einem Iterator? Kann man damit die Elemente rausholen?
Man sucht nach einer Lösung bei anderen, obwohl die eigene Lösung am nächsten zur eigentlichen Lösung ist....
Welcher? Die shuffle-Methode aus #27? Nicht wirklich, zumal Du in #1 geschrieben hast, dass Du ohne Random auskommen musst. Die Methode gibt einfach ein x-beliebiges, zufällig gewähltes Lied zurück, mit einem Mischen (shuffle) hat das allerdings nichts zu tun. Natürlich kannst Du dafür so lange ein beliebiges Element suchen, bis Du eines findest, das bislang nicht gespielt wurde, das ist aber äußerst ineffizient.Mein Code war vollkommen richtig.
Also schön, dass du eine funktionierende Lösung gefunden hast. Deine übrige Aussage würde ich etwas anzweifeln, aber vielleicht willst du uns Deine Lösung ja einmal zeigen ....
public Lied shuffle()
{
Random titelNr=new Random();
int abspieleNr=titelNr.nextInt(lieder.size());
if(abgespielt.containsAll(lieder))
{
abgespielt.clear();
}
while(abgespielt.contains(lieder.get(abspieleNr))) //Diese Schleife hat in meinem Code gefehlt.
{
abspieleNr=titelNr.nextInt(lieder.size());}
abgespielt.add(lieder.get(abspieleNr));
return lieder.get(abspieleNr);
}
Nicht, dass das Alles in #28 nicht schon erwähnt wurde ... da findet sich bereits der Pseudocode dafür sowie Hinweis auf Ineffizienz und ein Vorschlad zu einer AlternativeJa, darauf trifft alles zu, was ich in #44 geschrieben habe
Abgesehen davon wäre das mit einer do-while-Schleife schöner.
Der Thread heisst ja auch "ohne java.util.random"... Ich bin ein bisschen überrascht ab Zeile 3