Lottogen, doppelte Zahlen vermeiden



  • 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