der stl container vector und mein problem



  • ich grüße euch alle und wünsche ersteinmal einen schönen 1 advent. 😉
    nun zum eigentlichen:
    wie ist es mir möglich einen buchstaben von {A, B, ... , Z} zufällig zu wählen?
    vielen dank schonmal
    grüße kylanysik



  • std::rand - und das dann %26 + 'A'....

    bb


  • Administrator

    unskilled schrieb:

    std::rand - und das dann %26 + 'A'....

    Das ist, soweit ich weiss, nicht garantiert. Da der Standard nichts über den Zeichensatz aussagt. Man kann sich aber leicht Abhilfe schaffen:

    #include <ctime>    // std::
    #include <cstdlib>  // std::rand, std::srand
    #include <iostream>
    
    int main()
    {
      int const MAX_ALPHA = 26;
      char const* alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
      std::srand(std::time(0)); // Seed mit aktueller Zeit setzen.
    
      char c = alpha[std::rand() % MAX_ALPHA]; // Zufallsbuchstabe holen.
    
      std::cout << c << std::endl;
      std::cin.get();
    
      return 0;
    }
    

    Falls du lieber nicht die C Random Schnittstelle einsetzen möchtest, kannst du auf Boost zurückgreifen:
    http://www.boost.org/doc/libs/1_37_0/libs/random/index.html

    Grüssli



  • Also ich wäre für eine einfachere Methode ^^

    #include <iostream>
    
    int main()
    {
        srand(unsigned(time(NULL)));
    
        char random_letter = static_cast<char>(rand()%26+97);
    
        std::cout << random_letter;
    }
    

    Have Fun ^^



  • Vieleicht veranschaulicht folgendes Beispiel den Ansatz der Lösungen:

    char a='a';
        cout<<a<<endl;   // Ausgabe: "a"
        a+=1;
        cout<<a<<endl;   // Ausgabe: "b"
    
    // Edit: oder so etwas:
        int i=66;
        char a=i;
        cout<<a<<endl;
    

    Schau dir mal die ASCII Tabelle an.



  • FreakY<3Cpp schrieb:

    Also ich wäre für eine einfachere Methode ^^

    #include <iostream>
    
    int main()
    {
        srand(unsigned(time(NULL)));
    
        char random_letter = static_cast<char>(rand()%26+97);
    
        std::cout << random_letter;
    }
    

    Have Fun ^^

    tzzzz - genau das hab ich gesagt... nur, dass du statt 'A' eben den wert aus der ascii-tabelle genommen hast - was dir aber gar nix bringt 😛

    bb



  • Naja aber es gibt hier auch Leute, die C++ grad anfangen oder kaum können und wenn du ihnen dann so einen Codeschnipsel hinwirfst, können die oft nichts damit anfangen ^^.


  • Administrator

    @ASCII Tabelle Leute,
    Ich kann mich nur wiederholen, das ist kein garantiertes verhalten. Es steht nirgends im Standards, dass hinter dem 'A' das 'B' folgen muss! Das ist abhängig vom Zeichensatz und der kann verschieden sein!

    Grüssli



  • ersteinmal vielen dank für die antworten 🙂
    das problem habe ich dank eurer antworten wie folgt gelöst:

    srand((unsigned)time(NULL));
    zahl = rand()%26+65;
    buchstabe = zahl;
    

    das funktioniert alles prima und ich bekomme (ob nun scheinbar oder nicht) zufallsergebnisse.

    nun schließt sich ein neues problem an...
    ich möchte das ergebnis einen container vector zuweisen. mein bisheriger code diesbezüglich lautet:

    vector<char> vctS;
      int zahl;
      char buchstabe;
      for(int i=1; i<32786;i++)
      {
        zahl = rand()%26+65;
        buchstabe = zahl;
        cout << buchstabe << "\n";
        vctS.push_back(buchstabe);
      }
    

    das problem ist, dass der vctS, welcher am ende lediglich die buchstaben enthalten soll, nur die zahlen aufweist.
    die umwandlung, die in der zeile "buchstabe = zahl" stattfindet funktioniert.
    nach ascii-tabelle bekomme ich wirklich nur die großbuchstaben.
    jedoch wenn ich dann dem vektor eben die variable "buchstabe" zuweisen möchte, geb ich ihn nur die jeweilige zahl.
    was mache ich falsch?
    grüße kylanysik



  • Kylanysik schrieb:

    das problem ist, dass der vctS, welcher am ende lediglich die buchstaben enthalten soll, nur die zahlen aufweist.

    Der Vector enthält erstmal nur Bytes. Der Rest ist eine Sache der Ausgabe. Du gibst den Vector also falsch aus.



  • problem gelöst!
    ich bin aber auch ein trottel.. ich danke dir 🙂
    grüe kylanysik


Anmelden zum Antworten