Probleme mit Zufallszahlen



  • Hi!

    ich habe mir gestern in der Hochschulbibliothek ein klasse c++ Buch ausgeliehen(c++ für Spieleprogrammierer by Heiko Kalista, echt zu empfehlen 😉 ) und habe es gestern bis auf 130 Seiten geschafft *puff*^^

    Mein eigentliches Problem sind jetzt jedoch Zufallszahlen, die ich erstellen will.
    Mein jetztiger "Testcode" zum rumspielen sah so aus:

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    #pragma comment (lib, "winmm.lib")
    
    int main(int argc, char *argv[])
    {
        int Zahl = 0;
        //Zufallszahl wird initialisiert
        srand (timeGetTime ());
    
        //Zufallszahl wird in Zahl eingespeichert
        Zahl = (rand ()%50)+1;
    
        //Ausgabe von Zahl
        cout << Zahl;
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Habe, wie im Buch auch beschrieben, erst einmal die Zufallszahl mit "srand (timeGetTime) initialisiert, aber da taucht irgendwie ein Fehler auf.

    Fehler :

    [Linker error] undefined reference to `timeGetTime@0'
    

    Habe die <windows.h> "included", wo ja die Zufallszahlen implementiert sind, aber irgendwie funktioniert das gar nicht 😢

    Finde den Fehler nicht und bitte um Hilfe 🙂

    Danke für eure Antworten 😉

    Weedjo



  • Wenn du wirklich die WinAPI-Funktion verwenden willst, mußt du dem Linker auch die richtige Library mitgeben (*nachguckt* laut MSDN die wintimer.lib).

    Aber ich nehme dafür lieber time() zur Initialisierung (dazu benötigst du den Header <ctime>) - das hat den Vorteil, daß es unabhängig vom System funktioniert.

    (btw, die <windows.h> enthält nicht die Zufallsfunktionen, sondern die WinAPI (wie deine timeGetTime() - rand() und srand() sind in der <cstdlib>)



  • Hallo

    Schreib einfach:

    srand((unsigned)time(NULL));
    

    chrische



  • Habe nach einiger google Recherche eine Lösung, aber keine Erklärung für mein Problem gefunden.

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    #include <stdlib.h>
    
    using namespace std;
    
    #pragma comment (lib, "winmm.lib")
    
    int main(int argc, char *argv[])
    {
    
        long zufall;
        srand(50);
        while (1)
        {
        zufall = (rand()%50)+1;
        cout << zufall << endl;
        system("PAUSE");
        }
        return EXIT_SUCCESS;
    }
    

    Jetzt stellen sich mir folgende Fragen : 😕
    1)Was ist das für ein Wert bei srand in der Klammer?
    2)Warum stand das in dem Buch mit timeGetTime ()? Ist das besser? Funktioniert das überhaupt irgendwie?^^

    Abermals entschuldigung dass ich nich gleich gesucht habe^^
    Hoffe trotzdem noch auf Aufklärung 😉

    Danke, Weedjo



  • Hallo

    1.) mit dieser Zahl wird der Zufallsgenerator initialisiert und auf Grundlage dieser Zahl werden die "Zufallszahlen" ermittelt.

    2.) Wenn dieser Wert immer gleich ist, werden auch die "Zufallszahlen" gleich sein, dass heißt, du solltest immer mit einer anderen Zahl initialisieren.

    chrische



  • Ahhh ja Klasse 🙂

    Vielen dank für die ultraschnelle Antwort 🙂
    Werde mir wohl das mit dem time() angewöhnen.

    Klasse Forum, werd ich wohl ab jetzt etwas öfter benutzen 🕶

    Weedjo



  • Der Wert in Klammern ist der Startwert für den Zufallsgenerator. Da ist ein willkürlich gewählter Wert (z.B. auf Basis der Systemzeit) auf jeden Fall besser als ein fest eingestellter Wert - dein Programm dürfte bei jedem Durchlauf die selbe Zufallszahl ausgeben.

    srand(timeGetTime()) oder srand(time(NULL)) an dieser Stelle nehmen die aktuelle Systemzeit als Startwert - auf diese Weise wird der Zufallsgenerator jedes Mal mit einem anderen Wert initialisiert und liefert immer neue Zahlen. (der Vorteil von time(NULL) ist, daß es zum C++ Standard gehört ;))

    Edit: Args, ich werde alt 😡


Anmelden zum Antworten