zufallsgeneration jed int max 1 mal



  • ich will für ein programm einen kurzen script schreiben, bei dem 26 zahlen von 1 - 26 zufalssgeneriert werden. jede zahl darf aber nur einmal vorkommen !

    ich hab das mal versucht, aber leider war das ein gigantischer script und er kam maximal bis zur 16. Zahl, dann hat er aufgegeben und wollt nicht mehr weiter.

    wie sollte man so was anstellen. ich guck nebenbei bei google, sollte ich mehr erfahren informiere ich euch. bisher war diese jedoch nicht erfolgreich.
    Deshalb wende ich mich ja wie imer an dieses Forum.

    es sollte zum ende dann sowas rauskommen, was ich in eine Datei schreiben kann.

    22
    6
    8
    1
    18
    26
    5
    14
    .
    .
    .

    (hat mein gehirn generiert 😃 )



  • std::vector<int> numbers;
    for(std::vector<int>::size_type n = 1; n <= 26; ++n)
    {
        numbers.push_back(n);
    }
    std::random_shuffle(numbers.begin(), numbers.end());
    


  • ich habs nicht so mit vectoren, aber entweder sagt er vector is not member of std.

    oder ohne std:: sagt er "vector undeclared first use this function.

    welche lib brauch ich dafür ?



  • #include <vector>
    

    bb



  • Zu Fuß gehts ähnlich. Man zähle von 1 bis 26 durch und wähle den Ort, nicht die Zahl, zufällig. Ist der Ort belegt, geh zum nächsten freien.



  • ähm #include <vector> war ja irgendwie naheliegen.

    bitte nicht lachen, aber so weit bin ich noch nicht was mein wissen angeht, da ich oft etwas progge, wo ein vector hilfreich / nötig ist, sollte ich mir das mal angucken.

    frage:(weg guck): wie krieg ich die zahlen da jetzt raus ?



  • Wie bei einem Array

    int zahl = deinvector[index];
    


  • #include <cstdlib>
    #include <iostream>
    #include <vector>
    
    int main(int argc, char *argv[])
    {
        std::cout<<"vector shuffle test";
        std::cin.get();
        int num[27];
        std::vector<int> numbers;
    for(std::vector<int>::size_type n = 1; n <= 26; ++n)
    {
        numbers.push_back(n);
        num[n] = numbers[n];
    }
    std::random_shuffle(numbers.begin(), numbers.end()); 
        std::cout<<num[1]<<"\n";
        std::cout<<num[2]<<"\n";
        std::cout<<num[3]<<"\n";
        std::cin.get();
        return EXIT_SUCCESS;
    }
    

    da kommt so aber das raus:

    vector shuffle test
    0
    131153
    0
    

    ok wo liegt der Fehler



  • Wozu nochmal extra in ein Array schreiben? Shuffle den Vector durch und gib ihn dann mal komplett aus.



  • hab ich das oben nicht gefragt wie ? o.0
    mit cout<<numbers; wird schrott draus. sagt der Compiler 🙂 hahaha.
    sry aber ich muss das alles erst mal kapieren.



  • Indizes gehen wie bei Arrays von 0 bis zur Grösse minus 1.

    Tim06TR schrieb:

    hahaha.
    sry aber ich muss das alles erst mal kapieren.

    Dann würde ich dir vielleicht wenigstens mal www.cplusplus.com anschauen, dort sind der std::vector und alle seine Funktionen erklärt.

    Und achte bitte endlich mal ein wenig auf deine Einrückung, Tim06TR.



  • oh. beim nachforschen bin ich jetzt auf iteratoren gestoßen.
    wie gebrauch ich den denn jetzt ?
    ZITAT:
    "Iterators are used to access members of the container classes"



  • Schau dir am besten mal die folgenden Artikel zur STL an. Es hat nämlich nicht viel Sinn, wenn wir dir das Ganze hier erklären.

    1) Container
    2) Iteratoren und Algorithmen
    3) Hilfsklassen und Erweiterungen



  • ich weiß nicht ob das hier angezeigt wird, man kann es ja mal versuchen.
    http://www9.picfront.org/picture/8z5OSDkH/thb/schrotti2.png

    falls nicht:
    http://picfront.de/d/8z5OSDkH/schrotti2.png

    das geschieht bei:

    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    #include <sstream>
    #include <string>
    
    int main(int argc, char *argv[])
    {
        std::cout<<"vector shuffle test";
        std::cin.get();
        int num[27];
        std::vector<int> numbers;
        std::vector<int>::iterator the_iterator;
        std::string total;
    
    for(std::vector<int>::size_type n = 1; n <= 26; ++n)
    {
        numbers.push_back(n);
        // deleted num[n] = numbers[n];
        the_iterator = numbers.begin();
        while( the_iterator != numbers.end() ) {
          total += *the_iterator;
          ++the_iterator;
        }
    }
    std::cout << "Total=" << total ;
    std::random_shuffle(numbers.begin(), numbers.end()); 
    
        std::cin.get();
        return EXIT_SUCCESS;
    }
    

    ich weiß die einrückung...



  • Tim, ich habe dir beschrieben wie du auf die indizies eines Vectors zugreifst, du musst es nur noch umsetzen 😉



  • Lies doch die vorherigen Posts und die verlinkten Artikel, dort wird die Thematik wirklich gut erklärt. Mit Halbwissen kommst du nämlich nie weiter, also nimm dir die Zeit für die Theorie.

    Tim06TR schrieb:

    ich weiß die einrückung...

    Wenn du es schon weisst, warum korrigierst du es dann nicht? Das sind ein paar Tabs. In modernen IDEs kannst du auch ganze Codeblöcke markieren und gemeinsam einrücken.



  • 1: sag mal hab ich dich ingnoriert ? habs wohl übersehen. haha 😃
    2: jupp alles geht auch einfach siehe firefighter3

    std::random_shuffle(numbers.begin(), numbers.end()); 
    int index = 1;
    int zahl = numbers[index];
    std::cout<<zahl<<"\n";
    


  • noch was beim "shufflen" würfelt er die immer gleich durcheinander, eventuell hilft mir das, im sinne meines progs, aber davon mal abgesehen, wie ändert man das (geht das überhaupt).



  • Ja, mit srand() .

    Und bevor du fragst, wie genau, informier dich bitte einmal selber. Ich denke, Links habe ich ausreichend gegeben.



  • ach srand() geht hier auch . na dann. hab das immer für rand() benutzt.
    naja eig ja total logisch, da das hier auch ein random func ist.

    ERST DENKEN DANN POSTEN, muss ich noch lernen. 😃


Log in to reply