Zufallsgenerator, Code-Frage...



  • Hallo,

    ich hatte so eine kleine Idee für ein Rollenspiel und hab mir Gedanken für einen Kampfablauf gemacht.
    Der Code sieht folgendermaßen aus:

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
    using namespace std;
    
    int main()
    {
    
        int hp=100;
    
        kampf:
        int min=7,max=25,dmg;
        while (hp > 0)
    
        {
        srand(time(NULL));
        dmg=min + rand()%(max-min+1);
        Sleep(2000);
        cout << "Mensch trifft dich fuer: " << dmg <<" Schaden." << endl;
        hp=hp-dmg;
        Sleep(850);
        cout << "Du hast noch " << hp << " Gesundheitspunkte." << endl << endl;
        Sleep(1500);
        cout << "Der Mensch holt zum naechsten Schlag aus." << endl << endl;
    
        goto kampf;
    
        }
        system("CLS");
        cout << "Du bist Tot!" << endl;
    }
    

    Das Programm funktioniert auch mitlerweile.

    Aber ich hatte folgendes Problem:

    Ich hatte am Anfang keinen Sleep Befehl.
    Dadurch wurde der gesamte Kampf ohne Verzögerung angezeigt.
    Aber komischerweise hatte das Programm jedes mal den gleichen Schadenswert ausgegeben. Aber eigendlich müsste der doch jedes mal die Zahl wegen der Schleife zufallsgenerieren??!!!
    Erst als ich einen Sleep Befehl nach der Zufallsberechnung einfügte hats funktioniert.

    Wie kommt das?

    Die anderen Sleep Befehle hab ich aus Stylegründen noch eingefügt.



  • srand() nur einmal pro Programmdurchlauf aufrufen 😉

    «Zufall» ist nur eine funktion auf den per srand() übergebenen wert. Wenn du die sleeps nicht hast läuft das ganze so schnell, dass du srand() immer den gleichen wert übergibts -> es kommen bei jedem durchlauf die gleichen ergebnisse 'raus



  • Das liegt daran, dass du srand() in der Schleife aufrufst.
    srand() hast du ja mit der aktuellen Zeit, also mit time(NULL) initialisiert. Daher ist die Schleife so schnell durchgelaufen, und nochmal von vorne angegangen, dass mit time() srand auf genau den selben Wert wie in der vorherigen Runde gesetzt wurde, da ja noch keine (im Bereich von time()) messbare Zeit vergangen ist.

    Lösung:

    Am besten srand() nur EINMAL außerhalb der Schleife aufrufen.



  • srand() darf oder sollte nur einmal im Programm aufgerufen werden.

    srand initialisiert den Zufallszahlengenerator mit dem übergebenen Wert. da du ihn aber mit time(null) initialisierst und time die zeit in sekunden wieder gibt, wird bei jedem Schleifendurchlauf der Zeichendurchlauf mit demselben Wert initialisiert wie im Schleifendurchlauf davor.

    also: srand an den Anfang der main(). und über das goto in deinem Code reden wir am besten nicht.



  • otze schrieb:

    und über das goto in deinem Code reden wir am besten nicht.

    Warum nicht? 😃

    Naja ich bin noch blutiger Anfänger, ich hab erst vor ein paar Tagen angefangen mit C++ .

    Aber Danke für die Antworten, jetzt weis ich bescheid!!!



  • huh wenn du gotos in deinem code hast dann ist das unter programmieren ungefähr so rüber als wenn du eine schublade voller bilder von halbnackten kindern hättest und bei der hälfte sind die augen ausgeschnitten

    es ist ungefähr so verschrien 🙂

    und ja, in 999/1000 fällen ist es die eindeutig schlechtere alternative zu anderen lösungen


Anmelden zum Antworten