Lotto-Schleife zieht selbe zahlen...



  • Ohne den Inhalt deines Beitrags gründlich gelesen zu haben:
    - Es gibt zig Lottozahlen-Threads hier und überall sonst wo
    - Es gibt so etwas wie Debugger, mit denen man Fehler finden kann

    Zeig mal 'n bissel Eigeninitiative.



  • Ersetze die Zeilen 14-21 durch folgendes:

    for( int j=0; j<i; ++j ) //'Abfrage' Schleife. Alle lotto[j], für die j<i ist, vergleichen
            {
                if( lotto[i] == lotto[j] )  //Abfrage ob Zahl doppelt gezogen wurde.
                { 
                    --i;
                    break;
                }
            }
    

    alles klar?



  • Ohh Verdammt. xD

    Okay, Fehler 1 hab ich gefunden Zeile sieht jetzt so aus:

    for(loop; loop == 6; loop++)
    

    Aber zahlen kommen immer noch doppelt vor, auch wenn ich das auf 7 setze 😞



  • Okay, jetzt funktioniert es. Und meinen Fehler hab ich auch entdeckt. Musste anstatt loop == 6 in der Schleife einfach loop < i bzw. j < i ...
    Na toll -.-

    Vielen Dank für die sehr schnelle Hilfe 🙂



  • Wenn du erst eine Lottozahl erzeugt hast ( i == 0 ), warum willst du dann über das komplette Array von 0 bis 5 drüber laufen? In den anderen steht doch noch garnix ( sinnvolles ) drin.



  • Übrigens: <time.h> ist kein C++, sondern C.
    In C++ heißt der Header <ctime>, die Funktionen sind dann alle im namespace std.
    _tmain und _TCHAR sind auch kein Standard - ich schätze mal WinAPI.
    Wenn du grade erst anfängst wäre es vielleicht sinnvoll dich erstmal mit den Standard-Funktionalitäten vertraut zu machen, statt irgendwelche Plattform/Compilerspezifischen Dinge zu nutzen. Sonst siehst man später lange Zeit nicht durch, was jetzt portabel ist und was nicht.



  • Nunja...

    Beide dinge so wohl das <time.h> als auch das " TCHAR* " was Visual Studio dort einfügt hab ich von meinem Programmier Lehrer aus der Schule. Ich mache zurzeit eine Schulische Ausbildung zum Informationstechnischen-Assistenten und er hatte uns die so gezeigt^^.



  • und wenn du einen Zähler nur in der For-Schleife benötigst und außerhalb nicht mehr, dann mach das so:

    for ( int i = 0; i < 6; ++i )
    

    Dann ist dieser Zähler außerhalb der Schleife nicht mehr gültig.



  • Damit die Verwirrung nicht zu gross wird 😃

    http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/2d5af4be-8baa-4ff1-bd65-21aefa049e4b/

    Hat also mit WinAPI nichts zu tun <- _tmain

    MfG f.-th.



  • Wieso immer alle diese Prüfung machen, ob eine Zahl schon gezogen wurde? Mach' es doch besser wie der Lottoautomat:
    Es gibt jede Zahl genau einmal (also ein Array mit den Zahlenwerten 1..49), dann die Zahlen mischen (einmal durch das Array laufen, und die Zahl an Index i mit der Zahl an einem zufälligen Index k tauschen), dann die ersten 6 Zahlen wählen. Fertig!
    Tipp: Das ist es noch nicht ganz, denn es wird normalerweise zwischen jeder Ziehung gemischt.



  • #include <iostream>
    #include <ctime>
    
    int main()
    {
    	size_t zahlen[49];
    
    	srand(static_cast<unsigned int>(time(NULL)));
    
    	// Initialisieren
    	for (size_t i = 0; i < 49; ++i)
    	{
    		zahlen[i] = i + 1;
    	}
    
    	// Mischen
    	for (size_t i = 0; i < 49; ++i)
    	{
    		if (rand() % 2)
    		{
    			std::swap(zahlen[i], zahlen[rand() % 48]);
    		}
    	}
    
    	// Ausgabe
    	for (size_t i = 0; i < 6; ++i)
    	{
    		std::cout << i + 1 << ". " << zahlen[i] << std::endl;
    	}
    
    	return 0;
    }
    


  • #include <set>
    #include <iostream>
    #include <ctime>
    
    int main()
    {
        srand(time(NULL));
    
        std::set <int> zahlen;
    
        // Ziehen
        while(zahlen.size() < 6) zahlen.insert(rand()%49+1);
    
        // Ausgabe
        for (std::set<int>::iterator it=zahlen.begin() ; it != zahlen.end(); ++it )
            std::cout << " " << *it;
    }
    

    alternativ std::vector<int> füllen und mit std::random_shuffle(...) mischen, dann die ersten 6 Ausgeben


Anmelden zum Antworten