Schleifen Problem



  • Hi, danke erstmal für die Rückmeldungen

    Skym0sh0 schrieb:

    (random_device)

    Wenn du genauer hinschaust ist es nach der globale Variable definiert

    Skym0sh0 schrieb:

    pfui, globale variablen

    Der Code wurde "zusammenkopiert" um zu zeigen welchen Problem ich hab und für die schnelle hab ich globale Variablen benutzt

    Skym0sh0 schrieb:

    hässlicher code

    Was ist daran so "hässlich" ? Also ich finde, dass man den Code ganz gut lesen und verstehen kann

    Skym0sh0 schrieb:

    ich glaube du bist dir nicht im klaren, was die sachen alle machen sollen

    Kann schon sein, ich arbeite zum ersten mal mit dem c+11 Header random. Falls ich was falsches mache, bitte sehr du darfst mich korrigieren.

    manni66 schrieb:

    Mit welchem a ist diese Bedingung wahr, wenn geld 20 ist?

    a > geld && a < 2
    

    Hi manni66, die Bedingung soll wahr sein wenn die zufällige Zahl "a" kleiner 20 und größer 2 ist, wenn es nicht der Fall ist nochmal die Schleife durchlaufen

    mfg Zenter



  • Zenter schrieb:

    manni66 schrieb:

    Mit welchem a ist diese Bedingung wahr, wenn geld 20 ist?

    a > geld && a < 2
    

    Hi manni66, die Bedingung soll wahr sein wenn die zufällige Zahl "a" kleiner 20 und größer 2 ist, wenn es nicht der Fall ist nochmal die Schleife durchlaufen

    Vergleiche nochmal deine beschriebene Bedingung mit deinem Code. Dann wirst du bemerken, dass dies nicht übereinstimmt.

    Skym0sh0 schrieb:

    die hälfte vom quellcode (dieses random_device) fehlt

    "Dieses" random_device ist Teil der Standardbibliothek (seit C++11). Deswegen inkludiert er den <random>-Header.



  • zenter schrieb:

    while(a > geld && a < 2);
    

    Sollte doch eigentlich so weit passen denn wenn a > 20 oder a < 2 ist soll die Schleife nochmal durchlaufen bis eben true rauskommt und die Schleife dann abbricht. Dann sollte ein willkürlicher Wert zwischen 20 - 2 im Konsolen Fenster erscheinen. Oder irre ich mich grad?



  • zenter schrieb:

    Oder irre ich mich grad?

    Ja.



  • Caligulaminus schrieb:

    Ja.

    Merci :), vielleicht ein wenig ausführlicher, wieso ich mich irre?



  • ananas schrieb:

    Vergleiche nochmal deine beschriebene Bedingung mit deinem Code. Dann wirst du bemerken, dass dies nicht übereinstimmt.



  • ok, das mit dem random device wusste ich nicht. ich nehme alles zurück und behaupte das gegenteil



  • while(a < geld && a > 2);
    

    die größer/kleiner Zeichen ändern? Bringt nichts, bekomme auch nicht das Ergebnis was ich will. Die Lösung ist 100% einfach doch ich krieg sie grad nicht hin, mein Schädel droht zu explodieren. 😃



  • Bist du dir sicher, das du den Code hier richtig wiedergegeben hast? Eigentlich kann die Schleife nicht unendlich laufen sondern nur einmal, da a nie gleichzeitig größer 20 und kleiner 2 sein kann.



  • Zenter schrieb:

    while(a < geld && a > 2);
    

    die größer/kleiner Zeichen ändern? Bringt nichts, bekomme auch nicht das Ergebnis was ich will.

    Damit hätten wir schon mal zwei der drei Operatoren betrachtet...



  • Dann soll es ein oder sein ||. Die Schleife läuft trotz all dem unendlich was ich nicht verstehe



  • while(a < 2 || a > geld);
    

    Das sollte die Lösung sein, und es schien mir unendlich weil es lange gedauert hat bis endlich eine Zahl von 2 - 20 gekommen ist, da der maximum Wert 4.294.967.295 ist. Das steig ich doch auf rand() um wenn es jedesmal 5 min braucht um eine kleine (in dem Fall) zufällige Zahl auszuwählen.

    Danke für die Antworten



  • Zenter schrieb:

    while(a < 2 || a > geld);
    

    Das sollte die Lösung sein, und es schien mir unendlich weil es lange gedauert hat bis endlich eine Zahl von 2 - 20 gekommen ist, da der maximum Wert 4.294.967.295 ist. Das steig ich doch auf rand() um wenn es jedesmal 5 min braucht um eine kleine (in dem Fall) zufällige Zahl auszuwählen.

    Danke für die Antworten

    Und auf einem 64-Bit-System kannste die 4.294.967.295 (u.U.) gleich noch mal quadrieren.
    Kein Grund jedoch, auf rand() umzusteigen. Schau dir mal den Modulus-Operator an( % ).

    ~Edit: Spezifizierung.~



  • Ja, leck xD und so einfach ist es. Danke dir !! 😃



  • Zenter schrieb:

    Das steig ich doch auf rand() um wenn es jedesmal 5 min braucht um eine kleine (in dem Fall) zufällige Zahl auszuwählen.

    Du machst es dir aber auch besonders kompliziert, würdest du doch mit rand() auch nicht machen.

    Früher, rand:

    a = rand() % (geld-1) + 2
    

    Heute, random_device:

    a = rd() % (geld-1) + 2
    

    Aber wenn du schon C++11 nimmst, nimm besser uniform_int_distribution:

    std::uniform_int_distribution<> d(2, geld);
    a = d(rd);
    

    Außerdem: brauchst du wirklich random_device? Das sieht wie ein Spiel aus, da reicht ein normaler Pseudo-Zufallsgenerator (wie std::mt19937) vollkommen aus, random_device braucht man in der Regel nur bei kryptografischen oder ähnlichen Anwendungen.



  • Jop, is mir erst jetzt im nachhinein klar geworden

    mfg Zenter



  • ipsec schrieb:

    Außerdem: brauchst du wirklich random_device? Das sieht wie ein Spiel aus, da reicht ein normaler Pseudo-Zufallsgenerator (wie std::mt19937) vollkommen aus, random_device braucht man in der Regel nur bei kryptografischen oder ähnlichen Anwendungen.

    👍
    Hier geht eine einfache Mersenne-Twister Engine. Seeden nicht vergessen.

    template<typename t>
    typename std::enable_if<std::is_integral<t>::value, t>::type xrand(t a, t b)
    {
            static std::mt19937 mtRandEngine(std::chrono::system_clock::now().time_since_epoch().count());
    
            std::uniform_int_distribution<t> distribution(a, b);
    
            return distribution(mtRandEngine);
    }
    


  • Wenn du das static bei der distribution wegmachst, dürfte das hinhauen.



  • Kellerautomat schrieb:

    Wenn du das static bei der distribution wegmachst, dürfte das hinhauen.

    Uupsi, vertippt 😃 thx


Anmelden zum Antworten