Java Random nummern nur ein mal?
Hallo liebe Communtity! Ich habe seit dem Neuen Schuljahr in der Oberstufe jetzt auch informatik! Wir sollen eine Art "Lottomaschiene" programmieren. Unten ist jetzt schon mein Anfang. Mein Problem ist jetzt, dass auch manchmal zahlen Doppelt Generiert werden! Ich müsste um das zu verhindern jede Zahl mit jeder vergleichen (das wären ja 36 Abfragen!!) und falls eine Zahl doppelt ist, alles nochmal generieren lassen. Gibt es eine elegantere Methode dafür?
Nein, dass sind auch nicht meine Hausaufgaben. Ich bin alt genug um zu erkennen, dass Hausaufgaben für mich selbst wichtig sind und alleine gmacht werden sollen.
Danke im Voraus lg Basti
import java.util.Random; import java.util.Arrays; public class LottoZahlen {
public static void main(String[] args) {
//Erstellung der LotoZahlhen
Random zufallsObjekt1 = new Random();
int zufallszahl1 = zufallsObjekt1.nextInt(50);
Random zufallsObjekt2 = new Random();
int zufallszahl2 = zufallsObjekt2.nextInt(50);
Random zufallsObjekt3 = new Random();
int zufallszahl3 = zufallsObjekt3.nextInt(50);
Random zufallsObjekt4 = new Random();
int zufallszahl4 = zufallsObjekt4.nextInt(50);
Random zufallsObjekt5 = new Random();
int zufallszahl5 = zufallsObjekt5.nextInt(50);
Random zufallsObjekt6 = new Random();
int zufallszahl6 = zufallsObjekt6.nextInt(50);
//Sollen die Zahlen angezeigt werden?
System.out.println("Sollen die Zahlen angezeigt werden? J / N?");
char antwort = Tastatur.leseZeichen();
if (antwort == 'j') {
// Zahlen.
int[] ints = {zufallszahl1,zufallszahl2,zufallszahl3,zufallszahl4,zufallszahl5,zufallszahl6};
// Zahlen sortieren.
Arrays.sort(ints);
// Die sortierten Zahlen so ausgeben.
String result = Arrays.toString(ints);
result = result.replaceAll(",", " -");
result = result.substring(1, result.length() - 1);
// Zahlen ausgeben.
System.out.println("");
System.out.println(result);
} // end of if
} // end of main
} // end of class LottoZahlen
8 Antworten
Grundsätzlich ist es wirklich einfacher und eleganter, wenn du eine (ArrayList) Liste erstellst und diese mit allen Zahlen im gewünschten Bereich füllst.
Dann sehe zwei Möglichkeiten:
Erstens, wie bereits mehrfach vorgeschlagen: du mischt die Liste und entnimmst die ersten x Zahlen.
Zweitens: du generierst zufällig Zahlen im Bereich von 0 bis [Größe der Liste] und entnimmst dann die Zahl an dem Index und entfernst dieses Element aus der Liste. Die Indizes müßten(afaik) aufrutschen.
Für eine Lottomaschiene ist es nicht wirklich schlimm, 6 if-Abfragen zu machen. Ob über Boolean oder ein Array in das du die schon gezogenen Werte speicherst ist ersteinmal dahingestellt.
Eleganter ist es aber trotzdem, eine Liste zu erstellen (kannst du ja auch dynamsich mit den Zahlen füllen), diese zu mischen und dann die ersten (oder letzten) Elemente davon holen.
Das Naheliegendste ist eine Liste, aus der du zufällig eine Zahl entfernst (und in eine andere Liste einfügst).
Und bitte, bitte gewöhn dir an, für jeden Bereich von Zufallszahlen nur ein einziges Random-Objekt zu erstellen. Auf genügend schnellen Computern, wo ein Random-Objekt mit der Systemzeit "gesät" wird, werden alle Random-Objekte innerhalb eines "Systemzeit-Ticks" erzeugt und liefern deshalb dieselben Zufallszahlen. (Es sollte mich wundern, wenn hier nicht regelmäßig alle 6 Zufallszahlen gleich sind.)
Eleganter wäre es, wenn du dir eine sortierte Liste mit den Zahlen von 1 bis 37 generierst, diese Liste in zufälliger Reihenfolge mischst ("shuffle") und dann die ersten 6 Zahlen dieser zufälligen Liste nimmst. Das, was hier in der Antwort ganz oben steht
, sieht doch schon ziemlich passend aus.
Genau das wollte ich auch vorschlagen! Das wäre denke ich die schönste und einfachste Lösung.
Mach dir eine kleine boolean Matrix mit allen zahlen und frag dann mit einer if-schleife ab, ob die stelle True (noch unbenutzt) oder false ist.
Nicht in Java - hier ist das Schlüsselwort goto zwar vorhanden, aber nicht belegt. In andern Programmiersprachen könnte man if ... goto als If-Schleife bezeichnen, wenn man mag.
Aber die unmotivierte Verwendung dieses Begriffs lässt auf Unkenntnis (bestenfalls auf einen etwas unaufmerksamen Autodidakten) schließen.
Es gibt keine if-Schleife.