srand(); <- Doppelte Ausgabe vermeiden?



  • Hallo Leute!

    Ich generiere mit Hilfe von srand(); eine reihe von Zufallszahlen.
    Genauer gesagt sind es 6 Zahlen welche durch Zufall zwischen 1 und 49 generiert werden.

    Bei der Ausgabe erhalte ich aber fast immer Doppelte zahlen. Mindestens 2 Zahlen sind gleich. Zum Beispiel kommts so heraus:

    1.Versuch: 1,39,12,23,39,23 <--- 2 mal 39!
    2.Verusch: 8,32,11,43,13,5 <-- jetzt ist gut!
    3.versuch: 48, 25,19,17,17,3 <-- 2mal 17!

    Wie kann ich das vermeiden das nur immer 6 verschiedene Zufallszahlen ausgegeben werden und keine Doppelte?

    mfg
    Pro



  • Wenn du eine neue Zahl generiert hast, teste doch einfach ob diese Zahl schon einmal in deinem Array ist..?! Wenn ja, dann lässt du halt so lange neu generieren, bis es eine Zahl ist die noch nicht vorkam...



  • vector<int> vec;
    vec.push_pack(rand()%50);
    int random;
    while(vec.size()< 6)
    {
    	random = rand()%50;
    	if(find(vec.begin(),vec.end(),random)==vec.end())
    		vec.push_back(random);
    }
    

    Devil



  • Ups! Da war jemand schneller! THX

    Ist der Code @Devil81 jetzt nur auf eine Zahl basierend oder auf alle 6 zahlf1.... bis zahl6f1 ??

    Und von wo bis wo? *g*.
    mfg
    Pro



  • So sieht das bei einem Profi aus 😉 :p

    du musst evtl. noch die <vector> und <algorithm>
    header einbinden, und darunter ein using namespace std;
    anschliessen.

    vector ist ein Dynamisches Array, mit push_back fügst du
    Elemente hinzu. Mit find stellst du fest ob ein Element im
    Vector schon vorhanden ist. vector hat auch einen op[],
    d.h. du kannst deine elemente mit vec[0-5] auslesen.
    vec.size liefert dir die Anzahl der Elemente um vector.

    Devil



  • Ok. Danke.
    Werde mal versuchen ob ichs hinkriege. thx 🙂



  • erste fehler!
    Wenn ich die vector.h oder die algorithm.h einbinden will, die findet er nich.

    Ohne diese kommen folgende Errors:

    Compiling...
    Interner LottogeneratorDlg.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(10) : error C2871: 'std' : does not exist or is not a namespace
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(223) : error C2065: 'vector' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(223) : error C2062: type 'int' unexpected
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(224) : error C2065: 'vec' : undeclared identifier
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(224) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(225) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(226) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(227) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(228) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(229) : error C2228: left of '.push_pack' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(231) : error C2228: left of '.size' must have class/struct/union type
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(231) : fatal error C1903: unable to recover from previous error(s); stopping compilation
    Error executing cl.exe.

    ??? Fragezeichen ???

    Um es zu verdeutlichen_

    //...
    srand (GetTickCount()); 
    
    int s1f1;
    int s2f1;
    int s3f1;
    int s4f1;
    int s5f1;
    int s6f1;
    
    CString zahl1f1;
    CString zahl2f1;
    CString zahl3f1;
    CString zahl4f1;
    CString zahl5f1;
    CString zahl6f1;
    
    CString ausgabe1;
    
    	s1f1 = rand()%(45)+1;
    	s2f1 = rand()%(45)+1;
    	s3f1 = rand()%(45)+1;
    	s4f1 = rand()%(45)+1;
    	s5f1 = rand()%(45)+1;
    	s6f1 = rand()%(45)+1;
    
    vector<int> vec; 
    vec.push_pack(s1f1); 
    vec.push_pack(s2f1);
    vec.push_pack(s3f1);
    vec.push_pack(s4f1);
    vec.push_pack(s5f1);
    vec.push_pack(s6f1);
    int random; 
    while(vec.size()< 6) 
    { 
        random = rand()%(45)+1; 
        if(find(vec.begin(),vec.end(),random)==vec.end()) 
            vec.push_back(random); 
    }
    
    	zahl1f1.Format("%i", s1f1);
    	zahl2f1.Format("%i", s2f1);
    	zahl3f1.Format("%i", s3f1);
    	zahl4f1.Format("%i", s4f1);
    	zahl5f1.Format("%i", s5f1);
    	zahl6f1.Format("%i", s6f1);
    
    	ausgabe1 = zahl1f1 + ", " + zahl2f1 + ", " + zahl3f1 + ", " + zahl4f1 + ", " + zahl5f1 + ", " + zahl6f1;
    	m_strText.SetWindowText("Zahlen werden mit '|' getrennt.\n\n" + ausgabe1);
    
    //...
    


  • Schau dir mal Standard C++ an 😉

    Also, erstens bei Standard Headern lässt man neuerdings
    das .h weg, und "ersetzt" es durch ein using namespace std;
    unter den standard headern:

    #include<vector>
    #include<algorithm>
    using namespace std;
    

    Das musst du in die Cpp einbinden, oder in die .h,
    wenn vector eine membervariable ist.

    Devil



  • ok. thx. funzt!
    Bis auf das da:

    Compiling...
    Interner LottogeneratorDlg.cpp
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(225) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(226) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(227) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(228) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(229) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'
    C:\Programme\Microsoft Visual Studio\MyProjects\Interner Lottogenerator\Interner LottogeneratorDlg.cpp(230) : error C2039: 'push_pack' : is not a member of 'vector<int,class std::allocator<int> >'



  • das muss push_back heissen.
    Tippfehler 😉

    Devil



  • Aso. Grins. Aber VisualC++ hat auch pusch_pack! in der Variablenvorschau angezeigt?? LOL!

    Gut, die ersten dreimal hats gut geklappt, nix doppelt.
    aber dann hatte ich beim 4ten mal wieder zweimal 26 drin??

    Muss da wohl was falsch sein...

    s1f1 = rand()%(45)+1;
    	s2f1 = rand()%(45)+1;
    	s3f1 = rand()%(45)+1;
    	s4f1 = rand()%(45)+1;
    	s5f1 = rand()%(45)+1;
    	s6f1 = rand()%(45)+1;
    
    vector<int> vec; 
    vec.push_back(s1f1); 
    vec.push_back(s2f1);
    vec.push_back(s3f1);
    vec.push_back(s4f1);
    vec.push_back(s5f1);
    vec.push_back(s6f1);
    int random; 
    while(vec.size()< 6) 
    { 
        random = rand()%(45)+1; 
        if(find(vec.begin(),vec.end(),random)==vec.end()) 
            vec.push_back(random); 
    }
    

    mfg
    Pro



  • Wie wärs denn mit einer std::set und einer schleife bis std::set.size() die gewünschte menge hat ?



  • Hm, guck dir wirklich mal ein gutes Tutrial an 🙄
    Shades zum Beispiel, oder das von Volkard.

    // s1f1 = rand()%(45)+1;
    //    s2f1 = rand()%(45)+1;
    //    s3f1 = rand()%(45)+1;
    //    s4f1 = rand()%(45)+1;
    //    s5f1 = rand()%(45)+1;
    //    s6f1 = rand()%(45)+1;
    
    vector<int> vec;
    //vec.push_back(s1f1);
    //vec.push_back(s2f1);
    //vec.push_back(s3f1);
    //vec.push_back(s4f1);
    //vec.push_back(s5f1);
    //vec.push_back(s6f1);
    int random;
    while(vec.size()< 6)
    {
        random = rand()%(45)+1;
        if(find(vec.begin(),vec.end(),random)==vec.end())
            vec.push_back(random);
    }
    CString temp;
    for(int i =0; i < vec.size();i++)
    {
    temp.Format("%i",vec[i]);
    m_ausgabe += " " + temp;
    }
    UpdateData(TRUE);
    

    Devil



  • Programmer schrieb:

    Genauer gesagt sind es 6 Zahlen welche durch Zufall zwischen 1 und 49 generiert werden.

    noch genauer

    eine zahl

    zwischen 0 und 50

    hmm wie sieht ihr dies?

    1,2,3,4,5,6

    sagt ihr

    1 bis 6

    oder ( korrekterweise )

    1 bis 7 ??? hmmmm die meisten profs sagen trozdem 1 bis 6 hmmmm



  • ok. Danke Devil81.

    Klappt jetzt wunderbar. THX!
    PS: Deine Homepage ist klasse *g*


Anmelden zum Antworten