[C/C++] rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von eevaa, 6. Februar 2009 .

  1. 6. Februar 2009
    rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    Hallo Leute,
    ich hab verwandte Themen schon mehrmals in Foren gefunden, aber gezielt mein Problem konnte ich damit nicht lösen.
    Bei meinem Programm erscheint zwar bei jedem neuen Start eine andere Zufallszahl, jedoch im Programm immer die gleiche.
    Hoffe ihr könnt mir helfen.
    Danke
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    void zufallszahl (int lokal_oben, int lokal_unten, int lokal_feld[])
    { int z,i;
     srand ((unsigned) time(NULL));
     for (i=0; i<lokal_oben; i++)
     {
     while (!(z<=lokal_oben && z>=lokal_unten))
     z=rand();
     lokal_feld[i]=z;
     }
    
    }
    int main()
    { 
     int unten=0, oben=100;
     int feld[oben];
     int i;
     zufallszahl(oben,unten,feld);
     for (i=0; i<oben; i++)
     cout << feld[i] << " ";
     cout << "\n\n";
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    
     
  2. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    Wenn ich mich recht errinnere und das stimmt was mein Lehrer meinte soll die rand() Funktion nicht so gut Funktionieren es dauert immer einige Zeit bis eine neue Zufalls Zahl generiert wird.
     
  3. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    du musst dann srand neu mit einem neuen wert benutzen:
    Bsp:
    Code:
     
    int i = 1;
    
    while (i<5) {
    srand(i); // alternativ time() + i ; es werden mehr als eine aktion pro sekunde abgearbeitet, deswegen würde ein neues srand(time()) nichts bringen
    cout << rand();
    i++;
    
    }
    
     
  4. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    srand liefert garnicht wirklich einen zufälligen wert. gibt dafür noch ne andere funktion.

    mein lehrer meinte aufjedenfall mal das es nicht so einfach ist ^^


    grüße
     
  5. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    das is klar... ein computer ist auf logik aufgebaut, kann also keine wirklich zufälligen zahlen ausgeben... deswegen srand(time(NULL)); die zeit is immer unterschiedlich
    glaub ich nich... oben steht der grund..
     
  6. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    liegt daran das er nicht in die while schleife geht.... weil die Bedingung nicht erfüllt ist. klar?
    Du sagst ja er soll dir eine Zufallszahl ausspucken wenn z<=100 ist oder >=0 . Dann erstellt er dir solange Zufallszahlen bis das zutrifft. Dann steht diese in z drin. Beim nächsten Schleifendurchlauf ist z immernoch mit der Zufallszahl bestückt und klarer weise wird die While Schleife auch nicht erneut ausgeführt und somit schreibt er das gleiche z an die nächste stelle in deinem Array.

    musst in deiner for schleife einfache z=-1 setzen und dann funktioniert das auch. Könnte dann so aussehen
    Code:
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    void zufallszahl (int lokal_oben, int lokal_unten, int lokal_feld[])
    { int z,i;
     srand ((unsigned) time(NULL));
     for (i=0; i<lokal_oben; i++)
     {
    [B] z=-1;
     while (!(z<=lokal_oben && z>=lokal_unten))[/B]
     z=rand();
     lokal_feld[i]=z;
     }
    
    }
    int main()
    { 
     int unten=0, oben=100;
     int feld[oben];
     int i;
     zufallszahl(oben,unten,feld);
     for (i=0; i<oben; i++)
     cout << feld[i] << " ";
     cout << "\n\n";
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    


    du kannst eigentlich auch die while schleife weglassen und einfach modulo deinem "oben"+1 rechnen das verwirrt vielleicht nicht so und ist nicht so fehleranfällig. Bekommst dann in diesem fall auch Zufallszahlen von 0-100 raus.

    Code:
    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    void zufallszahl (int lokal_oben, int lokal_unten, int lokal_feld[])
    { int z,i;
     srand ((unsigned) time(NULL));
     for (i=0; i<lokal_oben; i++)
     {
    [B] z=rand()%lokal_oben+1;[/B]
     lokal_feld[i]=z;
     }
    
    }
    int main()
    { 
     int unten=0, oben=100;
     int feld[oben];
     int i;
     zufallszahl(oben,unten,feld);
     for (i=0; i<oben; i++)
     cout << feld[i] << " ";
     cout << "\n\n";
     system("PAUSE");
     return EXIT_SUCCESS;
    }
    
    
     
  7. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    das problem dabei ist, dass der die zufallszahl auf basis der zeit bestimmt. und da die rechner immer so schnell sind, gibts immer die gleiche zahl.
    so wurds mir mal erklärt.
    du musst da irgendwie noch was einbauen, dass sich die zeit verändert, bzw langsamer oder schneller läuft.
     
  8. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    das hab ich ja gesagt... das ist mit srand(time(NULL)); ... wenn man diese time(NULL) durch eine andere zahl ersetzt, ist es nicht mehr von der zeit abgängig, sondern von der zahl, die man da reinschreibt... zum beispiel eine variable...
     
  9. 6. Februar 2009
    AW: rand() Befehl in while-Schleife liefert immer gleiche Zufallszahl

    Ja super Leute. Danke für die schnellen vielen Antworten.
    Spezieller Danke an Sith-Urs. Das mit dem z=-1 hat wunderbar geklappt und ist auch einleuchtend.

    Danke nochmals und eine gute Nacht euch allen!
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.