Mein Lotto Proggy



  • Hallo Leute,

    Ja ich weiss, es gab bei diesem Forum schon einige fragen bezüglich "Lotto" etc. Ich habe auch alle durchdacht gelesen und geschaut wie die Leute ihren Code geschrieben haben.

    Habe natürlich nicht blos ein Programm kopieren wollen und selbst ein Proggy geschrieben mit meinen Vorstellungen. Mit der Geschwindigkeit des Programmes bin ich sehr zufrieden. Falls etwas nicht stimmen sollte oder Verbesserungsvorschläge vorhanden sind nehme ich solche sehr gerne entgegen.

    Der gezeigte Code wird nur Sozusagen der Kern sein. Habe diesen für meinen Bruder geschrieben der bald ein Statistik Projekt schreiben muss für die Schule und habe ihm bischen helfen wollen.

    Bei Fragen/Anregungen kann auch gerne mir gemailt werden auf flo1984@gmx.ch werde mich demnächst noch hier registrieren. Sorry ...

    Hier der Code:

    #include <iostream>
    #include <conio.h>
    
    #define LZAHLEN 45
    #define BALLS 6
    #define LAUF 40000000
    
    using namespace std;
    
    int rnd(int range)
    {
    	int r;
    
    	r=rand()%range;		
    	return(r);
    }
    
    /* Seed the randomizer */
    
    void randomize(void)
    {
      srand(time(NULL));
    }
    
    int main()
    {
     randomize();
     short userTip[BALLS];
     short genNumbers[BALLS]; 
     short hilfgenNumbers[LZAHLEN];
     short curCheck;
     short b;
     unsigned long counter,durchschnitt, total;
    
     for (int i=0; i<BALLS; i++){
         cout << "Zahl" << i << " : ";
         cin >> userTip[i];
         }
    
    do
      {
      counter++;
    
    // Check Damit keine Zahl 2 Mal gewählt wird:
    
      for(int i=0;i<LZAHLEN;i++)
    		hilfgenNumbers[i]=0;
    
      for (int i=0; i<BALLS; i++){
      		do
    		{
    			b=rnd(LZAHLEN);	// Glückszahl
    		}
    		while(hilfgenNumbers[b]);	// Falls Zahl schon gewaehlt wurde wähle nochmals Zahl
    		hilfgenNumbers[b]=1;		// Markiere diese Zahl als gezeichnet!
    		genNumbers[i]=b+1;          // +1 da Arrays bei 0 anfangen
    
     	//	cout << genNumbers[i] << "   ";	
        //if (i==5) cout << "\n";
        }
    
    // Random Zahlen wurden erstellt.
    
    // Vergleiche die Zahlen  
    
      for (int u=0; u<6; u++){ // U = UserZahlen
         for (int g=0; g<6; g++){ // G = Generierte Zahlen
    
             if ( userTip[u] ==  genNumbers[g] ){
                 // cout << userTip[u];
                  curCheck++;
                  // break;
                 }
             }
         if (u==5){
          if (curCheck == 6) {
             cout << "Gewonnen bei: " << counter << " \n";
             if (durchschnitt==0) durchschnitt+=counter;
             durchschnitt=(durchschnitt+counter)/2;  
             total+=counter;      
             counter=0;
             }
    
          curCheck=0;
          }
    
         }
      }while(total < LAUF);  //  }while( counter != LAUF); // 
    
     cout << "Bin fertich: " << durchschnitt;
     getch();
    return 0;
    }
    

    gruss Flo



  • int rnd(int range) 
     { 
         int r; 
    
         r=rand()%range;        
         return(r); 
     }
    

    Abgesehen davon, dass rand kein guter Zufallszahlengenerator ist sollte man nicht modulo rechnen, wenn man Zahlen benachteiligen will. Solange RAND_MAX % range != 0 gibt es Zahlen, die häufiger vorkommen als andere.



  • while(hilfgenNumbers[b]);    // Falls Zahl schon gewaehlt wurde wähle nochmals Zahl
    

    Macht jetzt noch keine Probleme, wird aber welche machen, wenn die Anzahl der bereits existierenden Zahlen größer wird und der Bereich den man treffen muss damit kleiner.
    Sinnvoller wäre es alle Nachfolger einer gewählten Zahl eins nach vorne rücken zu lassen, und dann mit --range die nächste Zahl zu bestimmen.



  • Vielen Dank, für eure Antworten.

    @Pronto

    Habe mir deinen Vorschlag zu herzen genommen und bin sehr dankbar für diesen. Wobei ich sagen muss dass dank der srand Funktion die Zahlen ohne Probleme gut generiert werden (Lese ich aufjedenfall überall im Internet 🙄). Habe dank deinem Vorschlag jetzt ein neue Funktion gecoded, bezüglich deinem Vorschlag ohne modulo:

    int rndNummern(int kleinsteNum, int groessteNum)
    {
        int range = groessteNum - kleinsteNum + 1;
        return kleinsteNum + int(range * rand()/(RAND_MAX + 1.0));
    }
    

    @Noobie

    Danke, jedoch verstehe ich deine Idee nicht ganz. Dank dem Hilfs Array überprüfe ich das jede Zahl im Original Array unterschiedlich ist. Und meiner meinung nach sollte es bei Angaben bezüglich Anzahl keine Probleme geben, oder seh ich da etwas falsch?



  • flo_swiss schrieb:

    Vielen Dank, für eure Antworten.

    @Pronto

    Habe mir deinen Vorschlag zu herzen genommen und bin sehr dankbar für diesen. Wobei ich sagen muss dass dank der srand Funktion die Zahlen ohne Probleme gut generiert werden (Lese ich aufjedenfall überall im Internet 🙄). Habe dank deinem Vorschlag jetzt ein neue Funktion gecoded, bezüglich deinem Vorschlag ohne modulo:

    int rndNummern(int kleinsteNum, int groessteNum)
    {
        int range = groessteNum - kleinsteNum + 1;
        return kleinsteNum + int(range * rand()/(RAND_MAX + 1.0));
    }
    

    Ich bin mir nicht sicher ob das funktioniert. Aber ich würde es so machen:

    int rndNummern(int range)
    {
       int max = (RAND_MAX / range) * range;
       while (true) {
          int value = rand();
          if (value < max) return max % range;
       }
    }
    


  • Jo mein code bezüglich den Ranges funktioniert wunderbar mit RAND_MAX. Werde auch diesen Verwenden ausser jemand hat Kritik daran :-).

    Bei deinem Code:

    1 int rndNummern(int range)
    2 {
    3    int max = (RAND_MAX / range) * range; 
    4    while (true) {
    5       int value = rand();
    6       if (value < max) return max % range;
    7    }
    8 }
    

    Verstehe ich nicht ganz was du damit bezwecken willst Bei Zeile 3 * range entfernen. Ausserdem Zeile 6 benützt du einen Modulo dar ja nicht verwendet werden sollte?! Der Vollständigkeit wüsste ich gerne deine Logik dahinter...?!

    Liege ich da falsch?



  • Das Modulo an sich ist nicht schlimm, aber so wie du es zuerst implementiert hast war der Zufall nicht gleichmäßig. Nehmen wir an rand() ist gleichverteilt und RAND_MAX ist 4. Weiterhin sei range 2. Dann wird bei rand() % 2 in 60% der Fälle 0 rauskommen. Genau dann wenn rand() 0,2 oder 4 ist. In 40% der Fälle (1 oder 3) kommt 1 heraus. Die Null wird also bevorteilt. Um diese Bevorteilung zu verhindern sollte man bei der Modulooperation nur Zahlen zulassen, die kleiner als ein Vielfaches von range sind. Das wird in meiner Funktion erreicht.

    Zuerst wird das größte Vielfache von range kleiner gleich RAND_MAX bestimmt. Das macht: int max = (RAND_MAX / range) * range;
    Und nur wenn die Zufallszahl in kleiner als diese Zahl ist wird ein Wert zurückgegeben. Im Beispiel mit RAND_MAX == 4 gilt, dass max == (4 / 2) * 2 = 4. Und nur wenn rand() kleiner als 4 ist wird ein Wert zurückgegeben, damit haben wir sichergestellt, dass die 0 und die 1 gleichverteilt sind.


Anmelden zum Antworten