Zufallszahlen... (MFC)



  • Hi Guys,

    gibt es in den MFC keine "direkte" Unterstützung für Zufallszahlen (rand) ???

    Wie kann Ich es realisieren, dass mir nur Zufallszahlen zwischen 0 und 9 zurückgegeben werden und wie realisiere Ich es am Besten, dass mir zufällig Buchstaben des Alphabets ausgewählt werden ???

    Danke schon mal
    -Jackler 😕



  • Doch "rand" macht das.

    zu 0..9: Einfach die Zufallszahl modulo 9 rechnen. Dann bekommst du immer den Rest und der liegt zwischen 0 und 9.

    Du mußt dir die Zufallszahlen (nach modulo) von 0 bis wiviel Buchstaben du willst und dann die ensprechenden Zeichen aus dem ASCII-Satz nehmen.

    [ Dieser Beitrag wurde am 31.07.2002 um 14:05 Uhr von editiert. ]



  • Original erstellt von nö:
    **zu 0..9: Einfach die Zufallszahl modulo 9 rechnen. Dann bekommst du immer den Rest und der liegt zwischen 0 und 9.
    **

    Hmm ... ich würde eher sagen, das ergebnis liegt zwischen -1 und 9, da 0 auch noch im ergebnis sein kann ...
    0 <= ergebnis < 9



  • Hat MS nur in C# implementiert

    Zufallszahlen

    [ Dieser Beitrag wurde am 31.07.2002 um 14:25 Uhr von Unix-Tom editiert. ]



  • @deus
    Korrekt. Hab mich etwas vertan. Sollte eigentlich 0 bis 8 werden, und nicht "zwischen".



  • Danke Leute, werd's gleich mal so ausprobieren...



  • Hier mal ein bisschen Code:

    CString CPasswordGeneratorDoc::GeneratePassword(int mode, int length)
    {
        int begin = 0;
        int end = 9;
        int random;
        int i;
        CString str = _T("");
    
        /** 
         * Seed the random-number generator with current time so that
         * the numbers will be different every time we run.
         */
        srand(time(NULL));
    
        switch (mode)
        {
        case 0:     // nur Zahlen
            m_strPassword = _T("");     
            for (i = 0; i < length; i++)
            {
                random = begin + (rand() % (end - begin + 1));
                str.Format("%i", random);
                m_strPassword += str;
                str = _T("");
            }
            break;
        case 1:     // nur Buchstaben
    
            break;
        case 2:     // Alpha-Numerisch
    
            break;
        }
    
        return m_strPassword;
    }
    

    Mein Problem ist, dass Ich diese Funktion innerhalb einer Schleife (in der View-Klasse) des öfteren aufrufe, um dem User die Möglichkeit zu bieten, mehrere Passwörter auf einmal zu generieren... - nur generiert mir obige Funktion stets die selben Zufallszahlen... 😮

    Kann mir jemand sagen, warum bzw. hat jemand für mich eine Lösung parat ???

    Danke
    -Jackler



  • Dann solltest du die srand-Funktion vor deiner Funktion aufrufen.



  • Danke... - so scheint es nun zu funktionieren... 🙂

    void CPasswordGeneratorView::OnButtonGenerate() 
    {
        // Besorge Zeiger auf Dokumentenklasse
        CPasswordGeneratorDoc *pDoc = GetDocument();
    
        int mode = m_nMode;
        int amount = m_wndSpin.GetPos();    // Anzahl Passwörter
        int length = m_wndSpin2.GetPos();   // Länge der Passwörter
    
        /** 
         * Seed the random-number generator with current time so that
         * the numbers will be different every time we run.
         */
        srand(time(NULL));
    
        for (int i = 0; i < amount; i++)
        {
            // Erzeuge Password
            CString str = pDoc->GeneratePassword(mode, length);
            // Einfügen in die Liste
            m_wndList.InsertString(-1, str);
        }
    }
    


  • Guck mal hier:

    srand((unsigned)time(NULL));
    char feld[10 + 26 + 26];
    char c;
    int i;
    for (c=48; c<58; c++) feld[c-48] = c;  //Zahlen von 0 bis 9
    for (c=65; c<91; c++) feld[c-65+10] = c; //Buchstaben von A bis Z
    for (c=97; c<123; c++)feld[c-97+36] = c; //Buchstaben von a bis z
    CString pw;
    for (i=0; i<laenge; i++)  //laenge ist ne INT Variable halt wie lang das pass sein soll
    {
       int z = rand();
       z = int(62 * (double(z) / RAND_MAX));
       if (z<62)
       {
        CString temp; temp.Format("%c", feld[z]);
        pw += temp;
        int x = pw.GetLength();
       }
    }
    m_passwort = pw;    //m_passwort Ausgabe im Dialog oder sonst wo
    UpdateData(FALSE);
    

    Nur mal so..



  • entweder 1, oder 2, oder aber 3, könnte aber auch 4 sein, aber nein, es ist 5, haha, doch nicht ,weil es 6 ist, ätsch war nur ein Bluff, weil 7 is es, naja, vielleicht doch 8 doer 9

    So funzt der rand() % 9



  • Falsch.



  • Also ich Frage mich langsam ob manche hier noch an einer Antwort interesse haben. Ich habe eine Link gepostet (FAQ) in dem eine Funktionierende Funktion steht die eine Zufallszahl liefert und dann kommt die Frage "Warum bekomme ich immer die selbe Zahl ?"

    😕



  • Hallo Unix-Tom
    Dein Beispiel Generiert bei Neustart des Programms immer die selbe Reienfolge der Zufallszahlen

    Verantwortlich ist der Befehl
    srand(time(NULL));
    NULL gibt den Startwert an und der ist immer gleich

    Um das zu umgehen hier eine bessere möglichkeit

    time_t Zufall;
    srand((unsigned) time(&Zufall));
    

    die Funktion:

    int Zufall (int m_min,int m_max)
    {
        int zurueck_Zahl;
    
        do
        {
    
        zurueck_Zahl = rand();
    
        }while(zurueck_Zahl < m_min || zurueck_Zahl > m_max);
    
        return zurueck_Zahl;
    }
    

    Aufruf:

    int m_Zahlsetzen = Zufall(1,6);
    

    bitte nicht vergessen die Header time.h einzubinden

    Vossy



  • Der kann nicht immer gleich sein weil time(NULL) die aktuelle Zeit zurückliefert.
    Und die ist immer anderes . Außer die Funktion wird in der selben sekunde aufgerufen.



  • Original erstellt von Unix-Tom:
    Der kann nicht immer gleich sein weil time(NULL) die aktuelle Zeit zurückliefert.
    Und die ist immer anderes . Außer die Funktion wird in der selben sekunde aufgerufen.

    wohl eher selbe milisekunde 😃



  • time(NULL) liefert nur die seit 1970 vergangenen sekunden zurück und nicht die millisek.



  • Danke Unix-Tom... - hab' deine Lösung (siehe Link) bereits verwendet... - funktioniert, wie Ich es erhofft hatte...

    Nur nicht gleich "böse" werden... 😉

    Also Leute, lasst es mit diesem Thema endlich gut sein... - Ihr habt mir bereits tolle Lösungen angeboten... 🙂

    Ciao,
    -Jackler


Anmelden zum Antworten