Zufallszahl ermitteln



  • Soweit ich weiß, gibt es in der Standard-Bibliothek nur die Funktion rand(), welche Zufallszahlen liefert. Die sind allerdings recht groß und man kann auch kein Minimum oder Maximum angeben.
    Außerdem sollte man zuerst immer srand(..) aufrufen um den Zufallsgenerator zu initialisieren. Ansonsten erhälst du nämlich bei jedem Programmstart die gleiche Folge von Zufallszahlen. srand(..) erwartet einen Parameter, den es als Initialisierungswert für den Generator nimmt. Üblicherweise übergibt man da die Uhrzeit, weil dieser Wert immer anders ist.
    Z.B.:

    #include <time.h>
    
    ...
    
    srand((unsigned int)time(NULL));
    

    Um Zufallszahlen auf einen Maximalwert zu beschränken, musst du den von rand() zurückgegebenen Wert einer Modulo-Division mit dem Maximal-Wert unterziehen. Eine Modulo-Division liefert im Gegensatz zu einer normalen Division nicht wie oft das Maximum in den Wert passt, sondern den Rest der Division. Und der ist natürlich immer kleiner als der Teiler, sprich als das Maximum.
    Um auch noch einen Minimal-Wert zu haben, addierst du vor der Modulo-Division einfach das Minimum zum Rückgabewert von rand().
    Beispiel:

    int zufall = (rand() + min) % (max + 1);    // max + 1 weil man sonst den Maximalwert selbst nicht erhält
    

    Ich habe das ganze mal in eine handliche Funktion gepackt, sodass du weder den Zufallsgenerator initialisieren noch dich um die korrekte Beschränkung der Zufallszahl kümmern musst:

    unsigned int Randomize(const unsigned int nMin, const unsigned int nMax)
    {
    	static bool bInit = false;
    
    	if(!bInit)
    	{
    		srand((unsigned int)time(NULL));
    		bInit = true;
    	}
    
    	return((rand() + nMin) % (nMax + 1));
    }
    

    Vergiss aber nicht die stdlib.h (srand(..) und rand()) und die time.h (time(..)) zu inkludieren!
    Danach kannst du die Funktion folgendermaßen verwenden:

    int zufall = Randomize(50, 100);   // 50 = Minimum und 100 = Maximum
    

    P.S.: Wenn ich mit der WinAPI gearbeitet habe, habe ich auch schonmal GetTickCount() als Initialisierungswert von srand(..) genommen. Theoretisch ist das aber nicht ideal, praktisch aber sehr unwahrscheinlich, dass man das Programm nochmal genau zur selben Millisekunde nach Rechner-Start nochmal aufruft.



  • da ich eine Grundlagenschulung in c++ für die azubis aus dem 1. halten soll, auf den der schulstoff aufbaut, wäre es sinnvoll, den azubis diesen stoff beizubringen. sie sollen sich ja in der schule leichter tun, und da bringt es nicht viel, wenn ich denen was anderes beibringe und se das zeug aus der schule nicht kapieren.
    aber trotzdem danke



  • Habe jetzt gefunden, wie ich das machen muss.
    Hier mal mein Code:

    int main()
    {
    	char cEingabe=' ';
    	int iZufallszahl=0;
    
    	Randomize();        
    
    	do
    	{	iZufallszahl = random(6) + 1;
    		cout << iZufallszahl;
    		cout << "\n\nMoechten Sie eine weitere Zahl wuerfeln?\t";
    		cin >> cEingabe;
    	}
    	while (cEingabe == 'j');
    
    	return 0;
    }
    

    Jetzt habe ich nur das prob, dass ich net weiß, welchen header ich brauch. in der hilfe kann ihc net nachschauen, weil ich die cds net da hab, und die aus platzgründen auf der hd nicht mitinst. habe



  • random ist in der cstdlib. Diese Funktion ist aber meines Wissens nach kein Standard, sondern eine Borland Erweiterung.



  • deshalb funzt das bei mir net.
    hab jetzt aber alles gefunden und romprobiert, bis es geklappt hat.
    und so gings:

    #include <iostream>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    
    int main()
    {
    	char cEingabe=' ';
    	int iZufallszahl=0;
    	srand(time(0));
    
    	do
    	{	iZufallszahl = (rand() % 6 + 1);
    		cout << iZufallszahl;
    		cout << "\n\nMoechten Sie eine weitere Zahl wuerfeln?\t";
    		cin >> cEingabe;
    	}
    	while (cEingabe == 'j');
    
    	return 0;
    }
    


  • Hallo,

    vermeidet in C++ doch bitte die alten Header und verwendet die neuen

    //#include <conio.h> der sollte eh gemieden werden, da nicht compilerunabhängig, nimm cin.get() oder getchar()
    #include <cstdlib>  //#include <stdlib.h> 
    #include <ctime>    //#include <time.h>
    

    Mfg

    GPC



  • GyroGearloose schrieb:

    Um auch noch einen Minimal-Wert zu haben, addierst du vor der Modulo-Division einfach das Minimum zum Rückgabewert von rand().
    Beispiel:

    int zufall = (rand() + min) % (max + 1);    // max + 1 weil man sonst den Maximalwert selbst nicht erhält
    

    Das ist bestimmt nicht korrekt - rechne es doch mal für ein paar Werte aus.

    Richtiger wäre so etwas:

    int zufall = rand() % (max-min+1) + min;
    


  • ist 1 dann die schrittweite? (also bei 1 sind ganze zahlen, bei 2 jede 2. zahl, bei 0.1 jede zahl in zehntel-schritten?)



  • Nein, 1 ist ein Korrekturwert, damit du Zufallszahlen einschließlich max erhältst (d%n ist immer kleiner als n). Um eine andere Schrittweite zu bekommen, mußt du dich etwas weiter verrenken:

    zufall = rand % ((max-min+1)/schritt) * schritt + min;
    


  • danke dir, hast mir echt sehr geholfen


Anmelden zum Antworten