Zufallsgenerator



  • Hallo

    ich habe ein Problem

    mein zufallsgenerator gibt immer die selbe Zahl aus.
    weiß nicht was ich falsch programmiert hab
    hier der Code

    srand( (unsigned) time(NULL) );
    int Zufallszahl= rand() % ( 9 - 1 + 1 );
    

    Danke schon mal für die Hilfe 😕



  • Steht das alles zufällig in einer Schleife? Wenn ja, zieh mal das srand( (unsigned) time(NULL) ) aus der Schleife raus, so dass nur int Zufallszahl= rand() % ( 9 - 1 + 1 ) in der Schleife steht. Btw. 9 - 1 + 1 = 9.



  • Versuchs mal so, dann gibt er zwar ab und zu auch noch die gleiche Zahl aus aber nicht immer.

    So haste auf jedenfall eine Zufallsfunktion.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    
    int a;
    
    srand(time (NULL) );
    
    a = rand()%10+1;
    
    cout<<a;
    
    system("PAUSE");
    }
    


  • danke für eure tipps,

    aber beide varianten führten leider nicht zum erfolg.
    ob ich

    srand( (unsigned) time(NULL) );
    

    in oder auserhalb der schleife platziere macht keinen unterschied.

    auch bei der anderen variante kommt von 10 durchgängen 8 mal die selbe zahl.



  • Vielleicht zeigst Du mal den ganzen Code.



  • Probier ansonsten mal einen anderen seed aus.



  • gewup schrieb:

    ob ich

    srand( (unsigned) time(NULL) );
    

    in oder auserhalb der schleife platziere macht keinen unterschied.

    Das kann ich dir nicht wirklich glauben. Zeig doch mal, wie du es umgesetzt hast.

    Und statt

    srand( (unsigned) time(NULL) );
    

    würde ich Folgendes schreiben:

    srand(static_cast<unsigned>(time(0)));
    


  • Bei rnd's Beispiel würde ich vlt. noch "#include <ctime>" einbinden...dann dürfte es funktionieren.



  • danke für eure hilfe

    mit

    srand(static_cast<unsigned>(time(0)));
    

    außerhalb der schleife hat es funktioniert

    👍 👍 👍



  • Hast du auch verstanden warum?



  • nunja...

    ich vermute mal dass mein zuffalsgenerator sonst immer mit dem selben start wert angefangen hat und ihc ihm nun so durch die uhrzeit jedesmal einen anderen wert gebe, oder???

    aber exaktere erklärung bzw genauere erklärung was das genau bewirkt könnte glaub net schade 😃



  • Die Zufallszahlen sind eine deterministische Kette. Das heißt die sind immer gleich. Jedesmal. Deswegen wählt man mit "seed" einen Anfangspunkt in der Kette und holt sich mit rand jedesmal das nächste Element der Kette.

    In deinem ersten Fall hattest du jedesmal, vor jedem rand-Aufruf, den Anfangspunkt neu gesetzt, und zwar auf time(0). Und da time(0) sich nur jede Sekunde ändert und das eine lange Zeit (in Code) ist, liest du also immer nur ein Element vom Ausgangspunkt aus ein. Und zwar immer das gleiche.

    Das ganze wirft sowieso ein Problem auf: Kennt man den seed und weiß wo man sich in der Kette befindet (sprich wie oft rand schon aufgerufen wurde) oder hat sonstige Daten (welche Zufallszahlen waren zuletzt?) kann man die nächste vorhersagen.

    Nützlich ist "seed" auch wenn man bestimmte Zufälle wieder herstellen will. Gerade bei Spielen sehr sehr nützlich. Denn bei der zufälligen Levelerstellung kann man so durch Eingabe eines beliebigen seeds immer wieder die gleichen Level erstellen. Oder beim Speichern den seed mitgeben, so daß ein erneutes Laden nicht zum Schummeln genutzt werden kann. etc. pp.



  • noch eine frage::

    srand(static_cast<unsigned>(time(0)));
    

    was bedeutet das

    static_cast<unsigned>
    

    genau??



  • gewup schrieb:

    was bedeutet das

    static_cast<unsigned>
    

    genau??

    Kurz gesagt: Eine geprüfte Umwandlung (Cast) in ein unsigned [int]. Wobei ich persönlich das unsigned int ausschreibe...

    cu André



  • asc schrieb:

    Wobei ich persönlich das unsigned int ausschreibe...

    Mach ich sonst auch immer. Ich wollte das Beispiel einfach nur so wenig wie möglich abändern...


Anmelden zum Antworten