Erneut Fragen zu Zufallswerten



  • Hallo Freunde der Sonne!
    Für mein kommendes Projekt muß ich wissen, wie man einer String-Variablen ein zufälliges Element aus einer selbsterstellten Liste (Array) zuweist.

    In Python habe ich dies immer wie folgt realisiert:

    import random
    Zufaelliges_Wort = random.choice["Erstes Wort", "Zweites Wort", Drittes Wort" ]
    

    Bitte orientiert euch für die Beantwortung meiner Frage nicht an dem für C++11 vorgesehenem Zufallsmodul "random", da mein Kompilierer nicht in der Lage ist, diesen zu verwenden.

    Desweiteren möchte ich Zufallszahlen zwischen zwei selbstgewählten Ganzzahlen generieren. Ich wäre dankbar, wenn ihr mir an einem konkreten Beispiel zeigen könntet, wie dies geht.

    Vielen Dank für alle Antworten!



  • Vengeancos schrieb:

    Bitte orientiert euch für die Beantwortung meiner Frage nicht an dem für C++11 vorgesehenem Zufallsmodul "random", da mein Kompilierer nicht in der Lage ist, diesen zu verwenden.

    Dann ist das nächste aber schwierig:

    Vengeancos schrieb:

    an einem konkreten Beispiel

    Was kann denn dein Zufallsmodul? Was für Werte liefert es?


  • Mod

    Für das Intervall [\min, \max) \cap \mathbb{Z}:

    int i = std::rand() % (max-min) + min;
    

    x
    Voerher natürlich mittels srand seeden.
    Oder Boost verwenden.



  • Vielen Dank, das hat schon mal meine zweite Frage beantwortet.
    Nun benötige ich nur noch eine Antwort auf die erste Frage, ich hoffe ich habe diese eindeutig formuliert. 🙂

    DirkB: Einfach irgendein Beispiel, wurde mir aber schon geliefert, trotzdem Danke 🙂



  • #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int main() {
      srand(time(NULL));
      puts(((const char*[]){"Erstes Wort", "Zweites Wort", "Drittes Wort"})[rand()%3]);
      return 0;
    }
    


  • Super, Danke! 🙂


  • Mod

    random.choice schrieb:

    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    
    int main() {
      srand(time(NULL));
      puts(((const char*[]){"Erstes Wort", "Zweites Wort", "Drittes Wort"})[rand()%3]);
      return 0;
    }
    

    Verdammt nochmal, nicht so ein widerlicher Schund in meinem Board!11 😡 😡 😡 😡



  • Oder die tolle C++ Version davon:

    #include <vector>
    #include <iostream>
    
    template <class T>
    const T& randomChoice(const std::vector<T>& v)
    {
      return v[rand() % v.size()];
    }
    
    int main()
    {
      // TODO: srand aufrufen
      std::vector<const char*> v = {"Erstes Wort", "Zweites Wort", "Drittes Wort"};
      std::cout << randomChoice(v) << std::endl;
    }
    


  • Ich habe jetzt mal die Variante von vorhin versucht zu benutzen, aber das funktioniert nicht 😡

    string Zufallswort;
    string Zufallswort = puts(((const char*[]) {"Erstes Wort", "Zweites Wort"})[rand()%2]); // Zeile 30
    

    C:\Users\Henry\Desktop\C++\Übungen\Zufallszahlen\Zufallswerte.cpp In function 'int main()':
    30 7 C:\Users\Henry\Desktop\C++\Übungen\Zufallszahlen\Zufallswerte.cpp [Error] expected unqualified-id before '[' token
    30 77 C:\Users\Henry\Desktop\C++\Übungen\Zufallszahlen\Zufallswerte.cpp [Error] expected primary-expression before ')' token
    30 77 C:\Users\Henry\Desktop\C++\Übungen\Zufallszahlen\Zufallswerte.cpp [Error] expected ';' before ')' token
    *

    Und bei der zuletzt angegebenen Methode schau ich wie die Kuh ins Uhrwerk, ich hab von Templates, Klassen usw. keine Ahnung 😃 Hole ich aber nach


  • Mod

    Vengeancos schrieb:

    Ich habe jetzt mal die Variante von vorhin versucht zu benutzen, aber das funktioniert nicht 😡

    Natürlich nicht, es ist ja auch C - nicht aber gültiges C++. In C++ gibt es keine Compound-Literale, und die explizite Konvertierung mit der functional notation erlaubt grammatikalisch keine Arraytypen.

    Jedoch kann man diese mittels eines Typedefs angeben. Daher ist die C++-Version einfach

    #include <cstdlib>
    #include <cstdio>
    #include <ctime>
    
    int main() {
      std::srand(time(NULL));
      using arr = const char*[];
      std::puts(arr{"Erstes Wort", "Zweites Wort", "Drittes Wort"}[std::rand()%3]);
    }
    


  • Vengeancos schrieb:

    Und bei der zuletzt angegebenen Methode schau ich wie die Kuh ins Uhrwerk, ich hab von Templates, Klassen usw. keine Ahnung 😃 Hole ich aber nach

    Du programmierst C++ und hast noch nie std::vector gesehen? Das solltest du aber ganz schnell nachholen. Und wenn dir Template Funktionen noch nicht so zusagen kannst du statt dem T auch einfach selbst einen Typ einsetzen wie z.B:

    const std::string& randomChoice(const std::vector<std::string>& v)
    

    Ist dann natürlich nicht mehr so flexibel.



  • Oh oh, klingt alles sehr komplex. Aber danke für die Antworten. Dann werd ich das so machen.


Anmelden zum Antworten