Lottogen, doppelte Zahlen vermeiden



  • Guten Abend,

    ich versuche gerade einen Lootozahlengenerator zu programmieren.
    Wie ihr seht, kontrolliert mein Algorihtmus aber nur die Zahl, die ein Index davor ins Datenfeld geschrieben wurde. Wie muss ich das ändern?

    #include <iostream>
    #include <conio.h>
    #include <cstdlib>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
        int x, feld[6]={0};
        srand(time(NULL));
    
        for (int i=0; i<6; i++)
        {
            x=(rand()%49)+1;
    
            for (int j=0; j<i+1; j++)
            {
                while (x==feld[i])  //<---Hier haperts.  :rage: 
                   x=(rand()%49)+1;
            }
    
            feld[i]=x;
            cout<<feld[i]<<' ';
        }
        getch();
    }
    


  • Du hast einen Pool von 49 Zahlen. Jetzt ziehst du eine davon (wegen mir mit rand()%49). Dann musst du diese natuerlich aus dem Pool entfernen. Beim zweiten Mal ziehst du mit rand()%48 aus dem neuen Pool von 48 Zahlen eine. Das machst du dann so fuer jede zu ziehende Zahl. Das hat auch den Vorteil, dass fuer 6 aus 49 die Zufallsfunktion rand() auch nur 6 Mal aufgerufen werden muss.



  • Kann ich dies als Code sehen?

    Ich verstehe es schon, aber ich wüsste nur die Methode 5 Variablen zu erstellen und dann anschließend diese abzufragen. Das geht doch sicher schicker.



  • Hier mal dein Code, aber verbessert:

    #include <iostream>
    #include <ctime>
    
    int main()
    {
    	int zahlen[6] = { };
    
    	srand(time(NULL));
    
    	for (int i = 0; i < 6; ++i)
    	{
    		int x = (rand() % 49) + 1;
    
    		for (int j = 0; j < i; ++j)
    		{
    			if (zahlen[j] == x)
    			{
    				x = (rand() % 49) + 1;
    				j = 0;
    			}
    		}
    
    		zahlen[i] = x;
    	}
    
    	for (int i = 0; i < 6; ++i)
    	{
    		std::cout << zahlen[i] << std::endl;
    	}
    }
    

    Ob es so richtig ist - keine Ahnung. Ungetestet!



  • Und noch mit der STL:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ctime>
    
    typedef std::vector<int> ZahlenVec;
    
    int main()
    {
    	ZahlenVec zahlen;
    
    	srand(time(NULL));
    
    	for (int i = 1; i <= 49; ++i)
    	{
    		zahlen.push_back(i);
    	}
    
    	std::random_shuffle(zahlen.begin(), zahlen.end());
    
    	for (int i = 0; i < 6; ++i)
    	{
    		std::cout << zahlen[i] << std::endl;
    	}
    }
    


  • Dein Algorithmus ist leider nicht richtig. 😞



  • for(int i = 0; i < 6; i++)
    {
      int x = 0;
      while(!x)
      {
        x = (rand() % 49) + 1;
        for(int j = 0; j < i; j++) if (zahlen[j] == x) x = 0;
      }
      zahlen[i] = x;
    }
    


  • ich finde "asdasdasd" vector methode am besten.
    Aber er funktioniert nicht ?
    Vielleicht so:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ctime>
    
    int main()
    {
        std::vector<int> ZahlenVec;
    
        srand(time(0));
    
        for (int i = 1; i <= 49; ++i)
        {
            ZahlenVec.push_back(i);
        }
    
        std::random_shuffle(ZahlenVec.begin(), ZahlenVec.end());
    
        for (int i = 0; i < 6; ++i)
        {
            std::cout << ZahlenVec[i] << std::endl;
        }
        return 0;
    }
    

    hmm, das was er gemacht hat hab ich noch nicht in dieser Verwendung gesehen, wird sicher ein Grund haben, wird aber bestimmt so gehen.

    korigiert mich wenn hier murks mache 😃

    EDIT return Val



  • Tim06TR schrieb:

    ich finde "asdasdasd" vector methode am besten.
    Aber er funktioniert nicht ?
    Vielleicht so:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <ctime>
    
    int main()
    {
        std::vector<int> ZahlenVec;
    
        srand(time(0));
    
        for (int i = 1; i <= 49; ++i)
        {
            ZahlenVec.push_back(i);
        }
    
        std::random_shuffle(ZahlenVec.begin(), ZahlenVec.end());
    
        for (int i = 0; i < 6; ++i)
        {
            std::cout << ZahlenVec[i] << std::endl;
        }
        return 0;
    }
    

    hmm, das was er gemacht hat hab ich noch nicht in dieser Verwendung gesehen, wird sicher ein Grund haben, wird aber bestimmt so gehen.

    korigiert mich wenn hier murks mache 😃

    EDIT return Val

    Ich weiß auch gar nicht, was an meinem Algorithmus genau falsch sein soll. Die Vector-Variante müsste jedenfalls zu 100% korrekt sein. Ich sehe dort keine Fehlerquelle mehr...

    Was hattest du an meinem Quellcode überhaupt geändert? Du hast ein return eingefügt, okay... Aber bei mir funktioniert das auch ohne, da 0 der Standardrückgabewert ist.

    Außerdem hast du das typedef entfernt. Es kann allerdings sehr viel Tipparbeit ersparen!

    Beispiel:

    std::vector<int> bla;
    
    for (std::vector<int>::iterator...)
    {
     std::vector<int> x = ...;
    }
    

    vs.

    typedef std::vector<int> V;
    
    V bla;
    
    for (V::iterator)
    {
     V x = ...;
    }
    

    Nur als Beispiel...



  • gehört das nicht ins c++ forum?



  • c++ forum schrieb:

    gehört das nicht ins c++ forum?

    Vermutlich, ja 🤡



  • Es ist doch im C++ Forum. 😕



  • Hallo,

    Phisherman schrieb:

    Es ist doch im C++ Forum. 😕

    es gibt auch noch das hier:

    http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html 😉

    MfG,

    Probe-Nutzer



  • mit std::set gehts auch ganz einfach 🙂



  • Dieser Thread wurde von Moderator/in Marc++us aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Habs hinbekommen.
    Es schaut jetzt so aus:

    #include <iostream>
    #include <time.h>
    #include <cstdlib>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
        srand(time(NULL));
        int x=(rand()%49)+1, feld[6]={0};
        bool checker;
    
        feld[0]=x;
        cout<<feld[0];
    
        for (int i=1; i<6; i++)
        {
            cout<<' ';
            x=(rand()%49)+1;
            while (feld[i]==0)
            {
                  checker=false;
                  for (int j=0; j<i; j++)
                  {
                      while (x==feld[j])
                      {
                            x=(rand()%49)+1;
                            checker=true;
                            i--;
                      }
                      if (checker==false && j==i-1)
                      {
                            feld[i]=x;
                            cout<<feld[i];
                      }
                  }
            }
        }
    
        getch();
    }
    


  • Ich sehe insgesamt 4 Schleifen und 3x rand(). Die Loesung ist scheisse. Du hast alle Ratschlaege ignoriert. Warum stellst du dann ueberhaupt das Problem zur Diskussion?



  • zszsd schrieb:

    Ich weiß auch gar nicht, was an meinem Algorithmus genau falsch sein soll. Die Vector-Variante müsste jedenfalls zu 100% korrekt sein. Ich sehe dort keine Fehlerquelle mehr...

    Bei der nicht-Vector-Variante müsste es "j = -1" statt "j = 0" heißen.



  • Phisherman schrieb:

    Habs hinbekommen.
    Es schaut jetzt so aus:

    int x=(rand()%49)+1, feld[6]={0};
    

    Initialisierst du da alle 6 Felder von 'feld' mit 0?



  • @Blue-Tiger: Ja.

    @knivil: Ich kenne "set" und Vektoren nicht. Und ja, ich muss rand jedesmal neu initialisieren, da doch die Zeit benutzt wird. Mit meinem momentan C++ Wissen fällt mir auch keine andere Lösung ein. Ich habe auch nicht nach einer anderen Lösung gefragt, sondern nach einer Korrektur. 👎


Anmelden zum Antworten