Zufälliger Wert



  • Hallo zusammen. Ist es möglich eine Varianble mit einem zufälligen Wert zu initialisieren?
    Wenn ja wie macht man das?
    MfG



  • Das geht mit der Funktion rand, z.B. so:

    #include <ctime>
    
    int main() {
      srand (time(0)); // Zufallszahlengenerator initialisieren
      int num = rand(); // Zufallszahl erzeugen
    }
    

    Ansonsten Google: Zufallszahl C++

    Greetz



  • Benutze den Zufallsgenerator:

    int x = rand();

    damit das auch halbwegs zufällig wird mußt Du zu Beginn (und wirklich nur ein einziges Mal zu Beginn) initialsieren, etwa mit

    srand(time(0));

    Im Ganzen:

    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      srand(time(0));
    
      int x = rand();
      cout << x;
    }
    


  • Kann man dem Zufallswert auch ein Limit nach oben und unten geben?



  • Ja, du kannst den Wert mit Modulo-Operator beschränken auf [0,n[ und durch Addition verschieben in den Bereich [m,n+m[:

    int x = rand() % (max-min+1) + min;
    

    (wenn du die Grundlagen verstanden hast, lass dir von TactX erklären, warum man es profesionell nicht so macht :D)



  • Wenn man sich ein paar Werte aussucht, z.B. 25 für min und 300 für max:

    void CHARAKTER::angreifenSpieler(void) //Funktionsdefinition außerhalb Klasse
    {
         int schaden;
         for(i=0;i<=20;i++)
         {
         srand(time(0));
         z= rand() % (300-25+1) + 25;
    
         cout << schaden << endl;
    
         system("Pause"); //Jo Systemabhängig
         }
    
         cin.peek(); 
         getchar();
    
    }
    

    Ergebnis:
    Der Ergebiswert z rutscht einfach rauf und runter, mit ein bisschen Zeitgefühl wäre das ganze dann sogar noch kontrollierbar!
    Was wäre denn nun die optimiertere Lösung?



  • (<ironie>)
    vielleicht

    #define MIN 57
    #define MAX 123
    srand(time(NULL));
    int i = MAX + 1;
    while( i > MAX || i < MIN )
      i = rand();
    

    ?
    😃 🙂 😉
    (</ironie>)

    mfg,
    julian



  • CStoll schrieb:

    (wenn du die Grundlagen verstanden hast, lass dir von TactX erklären, warum man es profesionell nicht so macht :D)

    *lol* 👍

    Edit: @ Julian__: Wie du dem Link aus meiner Sig entnehmen kannst, ist das nichtmal unbedingt die schlechteste Lösung.



  • @Haroeris: Also dein Code enthält schon mal den beliebtesten Anfängerfehler im Umgang mit rand() - du mußt den Zufallsgenerator nur einmal beim Programmstart initialisieren, danach läuft er recht zuverlässig, ohne daß du weitere srand()-Aufrufe ergänzen mußt.

    (und daß du die Variable 'schaden' nirgends gefüllt hast, will ich mal übersehen)



  • CStoll schrieb:

    ...- du mußt den Zufallsgenerator nur einmal beim Programmstart initialisieren, danach läuft er recht zuverlässig, ohne daß du weitere srand()-Aufrufe ergänzen mußt....

    Was vermutlich der Grund dafür ist, warum es dafür eine eigene Funktion gibt ... immerhin spräche nicht viel dafür, jeden User immer dieselben 2 Funktionen hintereinander aufrufen zu lassen - dann würde eine reichen/besser sein. 😉

    Gruß,

    Simon2.



  • CStoll

    Also dein Code enthält schon mal den beliebtesten Anfängerfehler im Umgang mit rand() - du mußt den Zufallsgenerator nur einmal beim Programmstart initialisieren, danach läuft er recht zuverlässig, ohne daß du weitere srand()-Aufrufe ergänzen mußt.

    (und daß du die Variable 'schaden' nirgends gefüllt hast, will ich mal übersehen)

    Hm...

    schaden=z;
    

    muss ich wohl schlicht vergessen haben.

    Ich bin Anfänger.

    Wenn ich aber

    srand()
    

    NUR in dieser klasse den NULL Wert übergebe, ist das doch nur EINMAL im Programm oder?
    Oder meinst du es wäre besser

    srand()
    

    in der main Funktion für das komplette Pogramm zu initialisieren?
    Der von mir gepostete code sollte nur ein Schnippsel sein, also so nicht unbedingt
    vollständig sein. Wie meintest du das

    beim Programmstart

    ??



  • Haroeris schrieb:

    Wenn ich aber

    srand()
    

    NUR in dieser klasse den NULL Wert übergebe, ist das doch nur EINMAL im Programm oder?

    Es steht nur einmal im Programmtext, aber zur Laufzeit wird es 20 mal für jeden Angriff aufgerufen - und DAS ist eher kontraproduktiv.

    Oder meinst du es wäre besser

    srand()
    

    in der main Funktion für das komplette Pogramm zu initialisieren?
    Der von mir gepostete code sollte nur ein Schnippsel sein, also so nicht unbedingt
    vollständig sein. Wie meintest du das

    beim Programmstart

    ??

    Ja, am Anfang der main() ist ein guter Zeitpunkt, um srand() aufzurufen - genau das meinte ich mit "beim Programmstart" (theoretisch könntest du es mit einigen Verrenkungen sogar vor dem Start der main() aufrufen ;)).


Log in to reply