Möchte ein Programm schreiben das Lottozahlen ausgibt(6 aus 45).
Der Benutzer soll eingeben können wie viele Tipps er generieren will.
Anschließend werden so viele Tipps wie der Benutzer wünscht generiert.
Mein Problem liegt darin, alle Tipps miteinander zu vergleichen, sodass kein Tipp zweimal vorkommt.
Wie setze ich das um????
Mein Code bis jetzt:
Java:
publicclassUE_03_c_Lottozahlen_2{publicstaticvoidmain(String[] args){System.out.println(test());}publicstaticStringtest(){String neu="";String arrays="";for(int i=0; i<4;i++){String[] tipp =generateLottoTipp();
neu =Arrays.deepToString(tipp);
arrays = arrays+neu+"";}return arrays;}privatestaticString[]generateLottoTipp(){String[] tipp;
tipp=newString[6];boolean[] lottozahlen=newboolean[46];int neuerTipp =0;for(int i =0; i<=5;i++){while(true){
neuerTipp =(int)(Math.random()*45+1);if(!(lottozahlen[neuerTipp])){break;}}
lottozahlen[neuerTipp]=true;
tipp[i]=neuerTipp+"";}Arrays.sort(tipp);return tipp;}}
Also ich würde die Tipps vorher nach Größe der einzelnen Zahlen sortieren und dann den neu generierten, vollständigen sechser Tipp mithilfe von .equals(String) mit den älteren vergleichen. Sollte der neue einem älteren entsprechen (.equals() gibt true zurück) dann muss der sechser Tipp nochmal generiert werden. Solange, bis .equals() nicht mehr true zurückgibt.
Du kannst auch ein HashSet verwenden um sicherzustellen, dass kein Tipp doppelt vorkommt. Ausserdem würde ich die Tipps als ArrayList zurückgeben, nicht als Strings.
Java:
privatestaticArrayList<Integer>generateLottoTipp(){ArrayList<Integer> tipp =newArrayList<>();for(int i =1; i <=45; i++) tipp.add(i);Collections.shuffle(tipp);
tipp.subList(6,45).clear();Collections.sort(tipp);return tipp;}publicstaticArrayList<ArrayList<Integer>>test(int n){HashSet<ArrayList<Integer>> set =newHashSet<>();while(set.size()< n) set.add(generateLottoTipp());returnnewArrayList<ArrayList<Integer>>(set);}publicstaticvoidmain(String[] args){for(ArrayList<Integer> tipp:test(6)){System.out.println(tipp);}}
Also ich finde meine gebastelte Klasse ist recht überschaubar
Sie braucht für 1 Million Lottotipps (keine Duplikate) ca. 10 Sekunden (alter Rechner, recht schlechte CPU).
Java:
importjava.util.TreeSet;publicclassZufall{publicstaticvoidmain(String[] args){Integer versuche =Integer.parseInt(args[0]);TreeSet<String> tipps =newTreeSet<String>();/*
* Hier werden die 6 Lottozahlen der Liste hinzugefügt
*/do{String lottozahlen =generateLottoTipp();
tipps.add(lottozahlen);System.out.println(lottozahlen);}while(tipps.size()!= versuche);}privatestaticint random (Integer von,Integer bis){/*
* Math.random() erzeugt einen Zufallswert zwischen 0 und 1.
* Das Ergebnis multiplizieren wir mit bis-von (45-1 = 44)
* Dann entfernen wir die Nachkommastellen (durch den typecast auf int).
* Jetzt erhalten wir ein Ergebnis, das von 0 bis 44 geht.
* Danach müssen wir noch "von" draufrechnen, damit das Ergebnis
* um die richtigen Stellen verschoben wird.
* In diesem Falle um 1 Stelle, also 1 bis 45.
*/return von +(int)(Math.random()*(bis-von));}privatestaticStringgenerateLottoTipp(){TreeSet<Integer> lottozahlen =newTreeSet<Integer>();/*
* Wir erzeugen solange Zahlen, bis wir 6 verschiedene zusammen haben.
*/while(lottozahlen.size()!=6){int random =random(1,45);
lottozahlen.add(random);}return lottozahlen.toString();}}
Sicherlich ist da auch noch einiges an Optimierungspotenzial. Man könnte z.B. die generateMethode noch soweit verschärfen, dass sie gewisse Wertemengen nicht zulässt, um eine höhere Chance zu erzielen, dass die 6 zufälligen Zahlen nicht schon bei den Tipps vorhanden sind.
Wo überprüfst du, ob die Zahlen innerhalb des Tipps nicht schon einmal vorgekommen sind? Da böte sich womöglich eine LinkedList an, welche du einmal am Anfang mit Zahlen von 1-45 füllst und dann nur noch für jeden neuen Tipp neu holst. Daraus holst du dann die Zahlen und löschst die geholten Zahlen. Danach holst du die Liste wieder und machst das gleiche, bis genug Tipps generiert wurden.
Und eine Frage noch: Wo checkst du, ob der Tipp schon einmal vorgekommen ist?
Aber 10 Sekunden auf einem eher bescheidenen Rechner und mit einem Java-Programm. Wie lange braucht dann ein C++ Programm auf einem Gamer PC? Zwei Sekunden?
Auf nem Gamer PC benötigt das Java Programm schon weniger als 1 Sekunde für 1 Million Tipps. Mit ein paar Optimierungen kann man es sogar auf 0,2 Sekunden bringen.
Leute danke fuer eure bemuehungen....leider kennen ich mich nicht sogut aus , deshalb wollte ich das array in einen String umwandeln und dann schauen ob es in dem neu zusammengebauten String enthalten ist. Wie wuerde so etwas in Codeform ausschauen?
Okay danke ....Jetzt habe ich einen String mit sechs Zahlen...den vergleiche ich mit dem Tippps davor. Wennn einen Tipp gleich ist si generiere ich einen neuen. Also brauche ich ein If mit eqalse abfrage. Nur wie kann ich danach den tipp wieder neu genierienen. Komme ja nicht mehr zurueck zu dem Code wo der Tipp enstanden ist.
Leute danke fuer eure bemuehungen....leider kennen ich mich nicht sogut aus , deshalb wollte ich das array in einen String umwandeln und dann schauen ob es in dem neu zusammengebauten String enthalten ist. Wie wuerde so etwas in Codeform ausschauen?
Also das ist eine sehr schlechte idee, du kannst ja nicht prüfen ob 2 enthalten ist wenn 20 schon drinnen ist...
Warum machst du dir nicht einfach eine Methode die überprüft ob eine zahl schon in dem Array enthalten ist? Jede Zahl mit der zu suchenden vergleiche, wenn du einnen Treffer hast true zurück geben, wenn du keinen hast false...
Java:
publicstaticbooleancontains(int toSearchFor,int[] vales){for(int v : vales){if(v == toSearchFor){returntrue;}}returnfalse;}