Lotto-Schleife zieht selbe zahlen...



  • Hallo zusammen,

    ich hab da ein kleines Problem. Meine Aufgabe ist es ein Programm zu schreiben das 6 Zufalls Zahlen zieht, wie beim Lotto. Das hab ich auch soweit, nur ist es unsinn das es Zahlen doppelt zieht. Das wäre bei Lotto auch eher von Nachteil. Daher wollte ich in die for-Schleife eine Abfrage schreiben die in einem solchen falle das Array um 1 zurück setzt und die Zahl neu zieht. Aber das tut es nicht. 😞

    Was mache ich Falsch?

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <time.h>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	srand(time(NULL));
    
    	int loop = 1, lotto[6], i = 1;
    
    	cout << "\tWillkommen zu Lotto '6 aus 49'\n\n";
    
    	// Zufallsgenerator
    	for(i=0; i < 6; i++)
    	{
    	lotto[i] = rand() % 50;					//Ziehung der Lotto zahlen.
    
    		for(loop; loop == 1; loop++)		//'Abfrage' Schleife.
    		{
    			if(lotto[i] == lotto[loop])		//Abfrage ob Zahl doppelt gezogen wurde.
    			{
    				i--;
    			}
    
    		}
    
    	}
    
    	for(i=0; i < 6; i++)
    		{
    
    		cout << lotto[i] << "\t";
    
    		}
    
    	getch();
    	return 0;
    }
    

    PS.: Bin nicht der beste Programmierer, bitte also um Hilfe mit Erklärung damit ich es verstehe und nicht nur um eine Lösung.

    mfg Fredi*


  • Mod

    for(loop; loop == 1; loop++)
    

    Erkläre mal was das machen soll bzw. denk mal darüber nach was dies macht. Dann wirst du dein Problem finden.



  • Du verwendest die Variable "i" auf jeden Fall doppelt. Das ist selten eine gute Idee.

    Edit: nein tust du nicht... aber das "--i" in deiner inneren Schleife ist irgendwie verwirrend. Du veränderst dort den Zähler deiner äußeren Schleife...



  • huhu, schau mal diese schleife an

    for(loop; loop == 1; loop++)
    

    Sie läuft nur 1x durch.
    - loop hast du anfangs 1 zugewiesen.
    - nach dem Schleifendurchgang ist loop=2 --> loop==1 ist also false.
    - du setzt loop nie wieder zurück --> hat immer den Wert 2.



  • 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