n verschiedene Arrays zufällig ausgeben - mit der Random-Klasse?

Wuast

Bekanntes Mitglied
Hallo liebe Java-Profis,
ich habe mir ein neues Mini-Programm zum Üben der Basics ausgedacht. Ein Haushalt plant gerne den Wocheneinkauf und die Gerichte entsprechend für eine Woche durch - d.h. es werden immer 7 verschiedene Gerichte benötigt. Jetzt sind die Mitglieder immer unentschlossen und wollen aus ihrem Pool an potenziellen Gerichten per Knopfdruck eine zufällige Auswahl an Gerichten vorgeschlagen bekommen. Später kann ich das ganze noch erweitern, z.B. durch Abfrage, wieviele Gerichte gewünscht sind und was mir sonst noch einfällt.

Aktuell steh ich an der Stelle, dass ich einen Array mit einer festgelegten Zahl an potenziellen Gerichten erstellt habe. Mir sind spontan nur 10 Gerichte eingefallen, aber es sollen ständig Dinge ergänzt werden (können).


[CODE lang="java" title="Array für die Gerichte"]public class Speisen {

public static void main(String[] args) {

String [] Gericht = new String[10]; // Array für die Auswahl an potenziellen Gerichten - erweiterbar

Gericht[0] = "Pizza";
Gericht[1] = "Pommes + X";
Gericht[2] = "Geiler Salat";
Gericht[3] = "Bolognese oder Lasagne";
Gericht[4] = "Kartoffeln + Kolrabi";
Gericht[5] = "Wraps";
Gericht[6] = "Burger";
Gericht[7] = "Paprika-Nudelauflauf";
Gericht[8] = "Grillen";
Gericht[9] = "Kartoffeln + Frikadellen / Gemüsebratlinge"; [/CODE]

Jetzt möchte ich gerne das Programm durchlaufen lassen und mir 7 (oder n) von 10 Gerichten, die zufällig ausgesucht werden, anzeigen lassen.
Wie muss ich die Random Klasse formulieren? Sagt mir mein Gefühl richtigerweise, dass ich dazu auch eine Schleife, bestenfalls die For-Schleife brauche?

Freue mich über einen kleinen Tipp, wie ich das in die richtige Richtung lenken kann. Mittels
Java:
String random = new String();

kann es nicht klappen, weil da fehlt mir doch das Objekt "Gericht"?! Wenn ich aber
Java:
Gericht random = new Gericht();


// oder

Gericht random = new String();

//oder irgendwie soetwas

ausprobiere, liefert das auch nichts - Überraschung :D

Danke vorab und LG
Yannik :)
 

mihe7

Top Contributor
Mir sind spontan nur 10 Gerichte eingefallen
Eigentlich wollte ich schreiben, dass Du vielleicht an Deiner Ernährung arbeiten müsstest, aber dann habe ich gesehen, dass Du sogar Insekten ("Grillen") auf dem Speiseplan hast...

Jetzt möchte ich gerne das Programm durchlaufen lassen und mir 7 (oder n) von 10 Gerichten, die zufällig ausgesucht werden, anzeigen lassen.
Du willst das Array zufällig sortieren (aka mischen). Such mal nach Fisher-Yates-Shuffle.

Nachtrag: zur zufälligen Auswahl von m aus n Objekten findest Du im Forum übrigens tonnenweise Infos - die Frage kommt gefühlt alle zwei Wochen :)

Nachtrag 2: wenn Du statt eines Arrays eine Collection verwendest, kannst Du natürlich auch Collections.shuffle verwenden.
 

Wuast

Bekanntes Mitglied
Eigentlich wollte ich schreiben, dass Du vielleicht an Deiner Ernährung arbeiten müsstest, aber dann habe ich gesehen, dass Du sogar Insekten ("Grillen") auf dem Speiseplan hast...
Ey hallo, geiler Salat?! :D Ist zum Glück nicht das einzige, was ich esse ;) (gibt ja schließlich noch MCs, Burgerking und KFC)

Du willst das Array zufällig sortieren (aka mischen). Such mal nach Fisher-Yates-Shuffle.

Nachtrag: zur zufälligen Auswahl von m aus n Objekten findest Du im Forum übrigens tonnenweise Infos - die Frage kommt gefühlt alle zwei Wochen :)

Nachtrag 2: wenn Du statt eines Arrays eine Collection verwendest, kannst Du natürlich auch Collections.shuffle verwenden.
Okay danke. Ich schau mal. Aber grundsätzlich heißt das, ich sortiere das Array zufällig und lass mir dann mithilfe einer Schleife 7/10 anzeigen - das wäre der Weg?

Collections hatte ich noch nicht. Bzgl der Zufallsauswahl habe ich schon mal Tante Google bemüht. So ganz das richtige habe ich nicht gefunden (evtl. auch nicht erkannt).

Danke für die Rückmeldung.
 

mihe7

Top Contributor
Aber grundsätzlich heißt das, ich sortiere das Array zufällig und lass mir dann mithilfe einer Schleife 7/10 anzeigen - das wäre der Weg?
Ja, in dem Fall ist das Mischen der wohl beste Weg. Wenn Du dagegen aus 100.000 Elementen 10 zufällige ohne Wiederholung haben willst, wäre das Mischen nicht optimal. Da ist es einfacher, in einer Schleife so lange eine Zufallszahl zu wählen, bis man auf ein bislang noch nicht gewähltes Element stößt.

Bzgl der Zufallsauswahl habe ich schon mal Tante Google bemüht. So ganz das richtige habe ich nicht gefunden (evtl. auch nicht erkannt)
Was meinst Du? Math.random() bzw. java.util.Random oder Collections.shuffle()?
 

Wuast

Bekanntes Mitglied
Ja, in dem Fall ist das Mischen der wohl beste Weg. Wenn Du dagegen aus 100.000 Elementen 10 zufällige ohne Wiederholung haben willst, wäre das Mischen nicht optimal. Da ist es einfacher, in einer Schleife so lange eine Zufallszahl zu wählen, bis man auf ein bislang noch nicht gewähltes Element stößt.


Was meinst Du? Math.random() bzw. java.util.Random oder Collections.shuffle()?
s.o., über Random "irgendwas" = new irgendwas();

bin absoluter Anfänger - hätte ich das erwähnen müssen? Mir ging es darum, den Einsatz von Arrays zu üben und nebenbei was neues zu lernen bzw. ein Gefühl zu bekommen für weitere Möglichkeiten.

Andere Dinge, die ich gesehsen habe (so auch ganze Code-Vorschläge) habe ich kopiert und eingefügt und versucht anzupassen, aber ohne Erfolg. Schien mir aber auch schwachsinnig an dieser Stelle, weil ich ja überhaupt nicht wieß, was ich tue. Insofern hangele ich mich dann erstmal mit der Schleife an Random-Objekten aus dem Array lang. Und dazu empfiehlst du mir Fisher-Yale? Habe da bereits einen Link gefunden, aber das schau ich mir morgen oder bald in Ruhe und zu anderer Uhrzeit nochmal an.
 

mihe7

Top Contributor
Mit new werden neue Objekte erzeugt. Du willst aber aus bestehenden eines auswählen, also ist new schon mal falsch.

Andere Dinge, die ich gesehsen habe (so auch ganze Code-Vorschläge) habe ich kopiert und eingefügt und versucht anzupassen, aber ohne Erfolg.
Durch Kopieren lernt man nix.

Auf die Elemente eines Arrays greifst Du per Index zu. Um ein zufälliges Element auszuwählen, musst Du also lediglich eine Zufallszahl bestimmen, die Du als Index zum Zugriff auf die Elemente im Array verwenden kannst.

Java:
String getRandomItem(String[] items) {
    int index = (int) (Math.random() * items.length); // index liegt im Bereich von 0 bis inkl. (items.length-1)
    return items[index];
}

Diese Methode würde also ein zufälliges Element aus dem übergebenen String-Array items zurückliefern. Problem: je öfter Du die Methode aufrufst, desto wahrscheinlicher wird es, dass das gleiche Element öfter gewählt wird.

Das kann man durch Mischen verhindern. In Deinem Link ist der Algorithmus ja auch schon implementiert. Die Idee ist ganz einfach: man teilt das Array gedanklich in einen gemischten und einen noch nicht gemischten Teil auf. Jetzt "zieht" man aus dem nicht gemischten Teil ein zufälliges Element und schiebt es an den Anfang/das Ende (je nachdem in welcher Richtung man arbeitet) in den gemischten Teil.

Ich kommentiere einfach mal den Code:
Java:
    Random rnd = ThreadLocalRandom.current(); // Zufallsgenerator besorgen
    for (int i = ar.length - 1; i > 0; i--)   // alle Elemente "rechts" von i gemischt
    {
      int index = rnd.nextInt(i + 1);    // wähle ein Element aus dem nicht gemischen Bereich
      // Simple swap                     // schiebe es durch Vertauschen an Position i
      int a = ar[index];                
      ar[index] = ar[i];
      ar[i] = a;
      // hier sind alle Elemente ab Position i gemischt
    }
 

Wuast

Bekanntes Mitglied
Mit new werden neue Objekte erzeugt. Du willst aber aus bestehenden eines auswählen, also ist new schon mal falsch.


Durch Kopieren lernt man nix.

Auf die Elemente eines Arrays greifst Du per Index zu. Um ein zufälliges Element auszuwählen, musst Du also lediglich eine Zufallszahl bestimmen, die Du als Index zum Zugriff auf die Elemente im Array verwenden kannst.

Java:
String getRandomItem(String[] items) {
    int index = (int) (Math.random() * items.length); // index liegt im Bereich von 0 bis inkl. (items.length-1)
    return items[index];
}

Diese Methode würde also ein zufälliges Element aus dem übergebenen String-Array items zurückliefern. Problem: je öfter Du die Methode aufrufst, desto wahrscheinlicher wird es, dass das gleiche Element öfter gewählt wird.

Das kann man durch Mischen verhindern. In Deinem Link ist der Algorithmus ja auch schon implementiert. Die Idee ist ganz einfach: man teilt das Array gedanklich in einen gemischten und einen noch nicht gemischten Teil auf. Jetzt "zieht" man aus dem nicht gemischten Teil ein zufälliges Element und schiebt es an den Anfang/das Ende (je nachdem in welcher Richtung man arbeitet) in den gemischten Teil.

Ich kommentiere einfach mal den Code:
Java:
    Random rnd = ThreadLocalRandom.current(); // Zufallsgenerator besorgen
    for (int i = ar.length - 1; i > 0; i--)   // alle Elemente "rechts" von i gemischt
    {
      int index = rnd.nextInt(i + 1);    // wähle ein Element aus dem nicht gemischen Bereich
      // Simple swap                     // schiebe es durch Vertauschen an Position i
      int a = ar[index];               
      ar[index] = ar[i];
      ar[i] = a;
      // hier sind alle Elemente ab Position i gemischt
    }
Top Antwort, dank dir :)

Aber ist doch komplizierter als gedacht.. :S
 

mihe7

Top Contributor
Aber ist doch komplizierter als gedacht.. :S
Das kann sein. Du musst ja irgendwie Duplikate abfangen. Der Algorithmus ist effizient und verhältnismäßig einfach.

Du kannst ja mal die Alternative selbst versuchen, das übt.

Dazu brauchst Du eine Schleife, in der so lange ein zufälliges Gericht auswählt wird, bis eines gefunden hat, das bislang noch nicht ausgewählt war. Hier musst Du also erstmal das Problem lösen: wie stelle ich fest, welches Gericht schon mal gewählt wurde?
 

Wuast

Bekanntes Mitglied
Das kann sein. Du musst ja irgendwie Duplikate abfangen. Der Algorithmus ist effizient und verhältnismäßig einfach.

Du kannst ja mal die Alternative selbst versuchen, das übt.

Dazu brauchst Du eine Schleife, in der so lange ein zufälliges Gericht auswählt wird, bis eines gefunden hat, das bislang noch nicht ausgewählt war. Hier musst Du also erstmal das Problem lösen: wie stelle ich fest, welches Gericht schon mal gewählt wurde?
Ja, die grundlegenden Gedankengänge kann ich gut nachvollziehen, oft sogar selber finden. Die Umsetzung im Code ist dann wieder was ganz anderes, aber da fehlt mir auch einfach das Fachwissen.
Ich zieh mir aktuell jetzt nochmal die ganz allgemeinen Grundlagen von Informatik (sprich Rechnernetzte, Datenträger, Systeme, ..) rein und stürze mich dann wieder auf die objektorientierte Programmierung. Bei Arrays, Schleifen und Switch-Case bin ich ausgestiegen, vllt. ist das auch einfach noch zu wenig know-how zur Umsetzung?! :(

Ich hab das aber hier alles im Kopf und komm bald drauf zurück. Bin glaub ich noch nicht so weit
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Verschiedene Arrays über Index aufrufen Java Basics - Anfänger-Themen 5
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
N Verschiedene Konstruktoren mit gleichen Datentypen Java Basics - Anfänger-Themen 8
Buroto Threads Verschiedene .txt Dateien Auf Listen und Verbinden Java Basics - Anfänger-Themen 3
S OOP Java Eingabe in verschiedene Datenbank Tabellen eintragen Java Basics - Anfänger-Themen 7
I SWT Plattformunabhängig laden - verschiedene SWT .jar laden Java Basics - Anfänger-Themen 0
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
K verschiedene Eingaben sortieren Java Basics - Anfänger-Themen 6
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
T for-each-Schleife, verschiedene Datentypen Java Basics - Anfänger-Themen 1
HoT verschiedene ArrayLists mit ähnlichem Namen in for-Schleife aufrufen Java Basics - Anfänger-Themen 3
FelixN Array mit verschiedene Datentypen als Rückgabewert? (Long und Double) Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
M JavaFX- Verschiedene Stages Java Basics - Anfänger-Themen 1
B Get / Set - Methode für verschiedene Entities? (generisch) Java Basics - Anfänger-Themen 21
L Wie Input auf verschiedene Kriterien hin überprüfen? Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Fahrzeugtypen mit unterschiedlicher Ausgabe Java Basics - Anfänger-Themen 17
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
F Komplexe Zahlen auf verschiedene Weise addieren Java Basics - Anfänger-Themen 18
N verschiedene Reihenfolgen ausgeben Java Basics - Anfänger-Themen 15
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
M Verschiedene Eingabe = Verschiedene Ausgaben Java Basics - Anfänger-Themen 5
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
T Datentypen Kann Java 2 verschiedene Datentypen vergleichen? Java Basics - Anfänger-Themen 2
B String auseinander nehmen in verschiedene Teile Java Basics - Anfänger-Themen 9
X Variablen Problem bei Aufteilung in verschiedene Class-Files Java Basics - Anfänger-Themen 4
E JAvaFX: Verschiedene Panels nach Klick auf Node des TreeView anzeigen Java Basics - Anfänger-Themen 0
T Java verschiedene Anweisungen Java Basics - Anfänger-Themen 23
W Verschiedene Bibliotheken in einer Anwendung? Java Basics - Anfänger-Themen 2
tuc Erste Schritte verschiedene objekte in einem feld speichern Java Basics - Anfänger-Themen 4
L Verschiedene Bilder per Knopfdruck anzeigen lassen Java Basics - Anfänger-Themen 17
J ArrayList über verschiedene Klassen verwenden Java Basics - Anfänger-Themen 7
P Erste Schritte durch MenuBar verschiedene Fenster öffnen Java Basics - Anfänger-Themen 2
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
GoldenShadow Input/Output Verschiedene Versionen von Input/Output Java Basics - Anfänger-Themen 3
I Drucken in Java / verschiedene Papierformate Java Basics - Anfänger-Themen 0
P Verschiedene Java Versionen nutzen Java Basics - Anfänger-Themen 6
Z Was habe ich davon mit einem Datentyp verschiedene Instanzen zu haben? Java Basics - Anfänger-Themen 6
S write(), weshalb verschiedene Ausgaben? Java Basics - Anfänger-Themen 4
E Erste Schritte Verschiedene Anfängerfragen (Rekursion, Terminierung, Schleife, etc.) Java Basics - Anfänger-Themen 5
I String trennen und verschiedene Wörter holen Java Basics - Anfänger-Themen 6
B Verschiedene Objekte in 2 dimensionalem Array speichern Java Basics - Anfänger-Themen 10
S Datei ausführen, verschiedene Ordner Java Basics - Anfänger-Themen 2
O Verschiedene Farben in einer GUI Java Basics - Anfänger-Themen 15
R Klassen Mehrere/Verschiedene Objekte umcasten Java Basics - Anfänger-Themen 8
N Vererbung Verschiedene Subclasses nach cast zur Superclass unterscheiden Java Basics - Anfänger-Themen 9
D Verschiedene Fragen zu meinem Projekt Java Basics - Anfänger-Themen 6
S textPane verschiedene formatierungen Java Basics - Anfänger-Themen 8
K Verschiedene JDK´s paralell nutzen? Java Basics - Anfänger-Themen 3
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
H 2 verschiedene Objekte in Liste mit Compareable sortieren Java Basics - Anfänger-Themen 7
G Erste Schritte Über verschiedene Datentypen iterieren. Gibt es sowas? Java Basics - Anfänger-Themen 19
N Verschiedene Klassen als Parameter elegant übergeben? Java Basics - Anfänger-Themen 4
X Listen und verschiedene Methoden Java Basics - Anfänger-Themen 6
B Zwei verschiedene Daten vergleich Java Basics - Anfänger-Themen 2
K Input/Output Verschiedene Ordner für Java u.v.m. Projekte Java Basics - Anfänger-Themen 3
G Umwandlung in verschiedene Zahlensysteme Java Basics - Anfänger-Themen 4
R Verschiedene Jar Versionen nutzen Java Basics - Anfänger-Themen 14
D Umgebungsvariable verschiedene Werte von JAVA_HOME? Java Basics - Anfänger-Themen 4
J verschiedene Anweisungen bei verschiedenen Zuständen Java Basics - Anfänger-Themen 9
F Info zwischen verschiedene Klassen austauschen Java Basics - Anfänger-Themen 4
R Input/Output verschiedene Datentypen als Bytes in Datei speichern Java Basics - Anfänger-Themen 15
Blindxantos Klassen in verschiedene Packages unterteilen Java Basics - Anfänger-Themen 2
F verschiedene Daten abspeichern Java Basics - Anfänger-Themen 13
N Verschiedene JFrames in einem JFrame anzeigen Java Basics - Anfänger-Themen 7
A Datentypen Verschiedene Threads synchronisieren Java Basics - Anfänger-Themen 3
D Mehrere verschiedene Farben pro fillRect Java Basics - Anfänger-Themen 3
M Verschiedene Werte in methoden Java Basics - Anfänger-Themen 3
K Verschiedene (Thread) Objekt-Positionen (int) in einem Array zusammenfassen Java Basics - Anfänger-Themen 3
J Verschiedene Rückgabetypen(int int char) Java Basics - Anfänger-Themen 10
S Datentypen Die verschiedene Java Datentypen [Anfänger] Java Basics - Anfänger-Themen 8
J OOP verschiedene Objekttypen ablegen Java Basics - Anfänger-Themen 4
B Welcher Feld Typ für verschiedene Datentypen? Java Basics - Anfänger-Themen 4
capgeti Verschiedene Rückgabetypen ohne Typecast möglich? Java Basics - Anfänger-Themen 7
Developer_X in JEditorPane verschiedene Farben, verwenden Java Basics - Anfänger-Themen 7
C verschiedene Label auf Knopfdruck abrufen Java Basics - Anfänger-Themen 4
L Verschiedene Fonts für verschiedene Dialogelemente Java Basics - Anfänger-Themen 2
G Verschiedene Packages Java Basics - Anfänger-Themen 3
G Daten in verschiedene Listen schreiben Java Basics - Anfänger-Themen 5
C Zustandsanzeige durch verschiedene Klassen Java Basics - Anfänger-Themen 4
S verschiedene Versionen Java Basics - Anfänger-Themen 2
G Verschiedene Exceptions zu gleichem Block Java Basics - Anfänger-Themen 6
T verschiedene Anfängerfragen Java Basics - Anfänger-Themen 20
J Verschiedene Ausgaben bei gleichen Ausdrücken (Typecasting?) Java Basics - Anfänger-Themen 5
N Verschiedene Input/Output Klassen Java Basics - Anfänger-Themen 3
G verschiedene datentypen in arraylist Java Basics - Anfänger-Themen 14
L verschiedene JPanel-Instanzen erstellen Java Basics - Anfänger-Themen 8
L 2 verschiedene Typen in einer Tabelle ablegen Java Basics - Anfänger-Themen 18
N Problem mit Tastatureingaben für verschiedene Datentypen Java Basics - Anfänger-Themen 3
L verschiedene formuare in einem fenster öffnen Java Basics - Anfänger-Themen 8
I Array für verschiedene Datentypen? Java Basics - Anfänger-Themen 5
R verschiedene dateitypen öffnen Java Basics - Anfänger-Themen 5
L verschiedene zeichen einlesen Java Basics - Anfänger-Themen 5
C 2 verschiedene Tables = 2 verschiedene Renderer ? Java Basics - Anfänger-Themen 5
S mit Buttons verschiedene Bilder laden Java Basics - Anfänger-Themen 4
S klassen in verschiedene Dateien Java Basics - Anfänger-Themen 5
3 Verschiedene Fragen (bin neu hier) Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben