Frage von invader7, 42

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
  
Antwort
von gfntom, 21

Mein Vorschlag ist nicht sehr elegant, aber einfach zu programmieren. 

36 Vergleiche? Das geht mit weniger. Ich würde ohnehin die Abfrage nicht erst am Ende machen und dann ALLE Zahlen neu generien, sondern nur die aktuelle.

Also in etwa so:

Zahl 1 erzeugen

Zahl 2 erzeugen

Solange Zahl 2 = Zahl 1 : Zahl 2 erzeugen

Zahl 3 erzeugen.

Solange (Zahl 3 = Zahl 2) oder (Zahl 3 = Zahl 1) : Zahl 3 erzeugen

Usw.

Es gibt elegantere Methoden, bei so wenigen Zahlen ist dieser Weg aber vermutlich der kürzere.

Antwort
von PWolff, 18

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.)

Antwort
von tDoni, 19

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.

Antwort
von TUrabbIT, 13

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.

Antwort
von Borgler94, 10

machs mit einem Set (z.B. implementierung TreeSet), in dem kann jede Zahl nur einmal vorkommen

Antwort
von ceevee, 18

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

http://stackoverflow.com/questions/15196363/java-how-do-i-create-an-int-array-wi...

, sieht doch schon ziemlich passend aus.

Kommentar von triopasi ,

Genau das wollte ich auch vorschlagen! Das wäre denke ich die schönste und einfachste Lösung.

Antwort
von W00dp3ckr, 17

Habt Ihr For-Schleifen?

Habt Ihr Sets und Maps?

Habt Ihr Arrays?

Habt Ihr Methoden?

Wenn ja: Schreib eine Methode, die prüft, ob eine Zahl schon gezogen wurde, wenn nein, dann füge sie zur Menge der gezogenen Zahlen hinzu. Wenn die Zahl schon einmal gezogen wurde, dann durchlaufe sie nochmals.

Durchlaufe diese Methode mittels einer For-Schleife mehrfach.

-

Natürlich kann man Random.shuffle verwenden, ich halte aber für unwahrscheinlich, dass das die Idee des Aufgabenstellers war.

Antwort
von fthee, 26

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.

Kommentar von W00dp3ckr ,

Es gibt keine if-Schleife.

Kommentar von PWolff ,

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.

Kommentar von fthee ,

äääh.... for-schleife meinte ich...

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten