(C++) mal wieder zufallszahlen...



  • hi leute, hab mich mal wieder n bissel mit c++ beschäftigt (hatte in den letzten monaten wenig zeit). ich hab ein programm geschrieben, welches 3 zahlen erstellt und den user dann nach dem ergebnis fragt. die kleinste und größte zahl kann der user am anfang bestimmen. nun wollte ich richtige zufallszahlen und nicht die "festen" von rand(), also hab ich mit srand(unsigned) time(&tTime) rumgespielt, aber dann bringt er mir 3mal die selbe zufallszahl anstatt 3 verschiedene. das liegt denk ich mal daran dass das programm die berechnung zu schnell durchführt und sich deshalb der sekundenwert nicht ändert. hoffe ihr habt das verstanden 😉
    da ich gerade n bissel die auslagerung von funktionen übe hab ich 2 dateien...nur als info

    hier erstmal der quelltext des Hauptprogramms.

    // Übung.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    #include "stdafx.h"
    #include <iostream.h>
    #include "Zufallszahlen.h"
    #include <time.h>
    #include <stdio.h>
    
    int iZahl1, iZahl2, iZahl3, iErgebnis, iEingabe, iMax, iMin;
    
    int main(int argc, char* argv[])
    {   
        cout<<"-- Dieses Programm erstellt 3 Zufallszahlen welche addiert werden. --"<<endl;
        cout<<"-- Man muss dann das richtige Ergebnis eintippen und das Programm  --"<<endl;
        cout<<"-- vergleicht das tatsaechliche Ergebnis mit dem eingegebenen.     --"<<endl;
    
        cout<<endl<<endl<<"Bitte geben sie nun die unterste Grenze für die Zufallszahlen ein: ";
        cin>>iMax;
        cout<<endl<<"Bitte geben Sie nun die oberste Grenze für die Zufallszahlen ein: ";
        cin>>iMin;
    
        iZahl1 = Zufall(iMax, iMin);
        iZahl2 = Zufall(iMax, iMin);
        iZahl3 = Zufall(iMax, iMin);
    
        iErgebnis = iZahl1 + iZahl2 + iZahl3;
    
        cout<<endl<<endl<<"Bitte geben Sie nun das Ergebnis ein:"<<endl<<endl;
        cout<<iZahl1<<" + "<<iZahl2<<" + "<<iZahl3<<" = ";
        cin>>iEingabe;
    
            if(iEingabe == iErgebnis)
            {
                cout<<endl<<endl<<"Das eingegebene Ergebnis ist richtig!"<<endl;
                cout<<endl<<endl<<"Taste druecken..."<<endl;
            }
            else
            {
                cout<<endl<<endl<<"Das eingebene Ergebnis ist leider falsch!"<<endl;
                cout<<"---- Das richtige Ergebnis waere "<<iErgebnis<<" gewesen."<<endl;
            }
    
        getchar();
    
        return 0;
    }
    

    hier kommt nun der code meiner selbsterstellten header

    #include <time.h>
    #include <stdlib.h>
    
    extern int Zufall(int iMax, int iMin)
    {
        int iRueck;
        time_t tTime;
    
        srand((unsigned) time(&tTime));
        do
        {
            iRueck = rand();
        }while((iRueck > iMin) || (iRueck < iMax));
    
        return iRueck;
    }
    

    mein compiler ist wie immer der von m$ 😉
    also meine frage: Wie kann ich das Programm dazu bringen, mir 3 verschiedene Zahlen auszugeben und nicht 3mal die gleichen?

    [ Dieser Beitrag wurde am 02.07.2002 um 11:21 Uhr von dogg editiert. ]



  • Du bekommst deshalb dreimal die gleich Zahl, weil Du dreimal schnell hinterander srand aufrufst. Damit wird dreimal der gleichen random seed verwendet. Besser ist es, das srand nur einmal, zum Programm beginn aufzurufen. Wenn Dir Das nicht gefaellt, kannst Du auch in Zufall pruefen, ob srand bereits aufgerufen wurde.

    int Zufall(int iMax, int iMin)
    {
        static int srand_called = 0;
        int iRueck;
        time_t tTime;
    
        if (!srand_called)
        {
            srand((unsigned) time(&tTime));
            srand_called = !srand_called;
        }
        /* Zufallszahl bestimmen Die Originalloesung war, ... naja*/
        return iMin + rand()%(iMax-iMin+1);
    }
    

    Zu beachten: auch in dieser korrigierten version wird nicht geprüft, ob iMax-iMin>0 bzw. iMax-iMin<RAND_MAX

    [ Dieser Beitrag wurde am 02.07.2002 um 11:40 Uhr von virtual editiert. ]



  • Verschoben nach Standard-C++.

    MfG SideWinder


Anmelden zum Antworten