C++ - Bitte um Hilfe!



  • Hallo,
    ich habe diese Woche angefangen, mich mit C++ zu beschäftigen und möchte gern zu Lernzwecken eine Idee verwirklichen.

    So sieht mein Code aus:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <time.h>

    using namespace std;

    int main(int argc, const char * argv[]) {

    vector<string> Teilnehmer;
    
    Teilnehmer.push_back("PersonA");
    Teilnehmer.push_back("PersonB");
    Teilnehmer.push_back("PersonC");
    Teilnehmer.push_back("PersonD");
    Teilnehmer.push_back("PersonE");
    Teilnehmer.push_back("PersonF");
    Teilnehmer.push_back("PersonG");
    Teilnehmer.push_back("PersonH");
    Teilnehmer.push_back("PersonI");
    
    
    
    cout << "Alle Eintraege: \n" << endl;
    
    
    for (int i = 0; i < Teilnehmer.size(); i++) {
    	cout << Teilnehmer.at(i) << endl;
    }
    
    cout << "\nWer davon bist du? \n" << endl;
    
    string TN;
    
    cin >> TN;
    
    
    cout << "\nHerzlich Willkommen, " << TN << "!\n" << endl;
    
    
    random_shuffle(Teilnehmer.begin(), Teilnehmer.end());
    
    for (const string &name : Teilnehmer) {
    	cout << " - " << name << endl;
    }
    

    Ich möchte, dass mein Programm einem Teilnehmer einen zufälligen Teilnehmer zuordnet. Das Ziel: Alle TN haben einen TN zugeordnet bekommen.

    Mein Problem: Ich habe keine Idee, wie ich die Ausgabe eines zufälligen TN erziele, und dabei nicht die Person erwische, die gerade ihren Namen eingegeben hat.

    Mein erster Gedanke ist "random_shuffle" und Iteratoren. Liege ich damit richtig und wie muss der Code dafür aussehen?

    Vielen Dank für eure Hilfe im Voraus.

    Viele Grüße
    Claudia



  • @frau_bemme sagte in C++ - Bitte um Hilfe!:

    Liege ich damit richtig und wie muss der Code dafür aussehen?

    Keine Ahnung, mir ist nicht klar, was du erreichen willst.

    Was bedeutet zuordnen?
    Was bedeutet dann alle haben einen zugeordnet? Es wird nur ein Name eingegeben.



  • Weihnachtswichteln:

    Beisp.
    Person A
    Person B
    Person C
    Person D
    Person E
    Person F

    nehmen teil.

    Jeder besorgt für eine Person ein Geschenk.

    Z. B. Person A für Person D, Person B für Person A ….



  • Also z. B.:

    Person A gibt ihren Namen ein, damit ist klar, der Zufallsgenerator muss zu diesem Zeitpunkt eine Person B - E zuordnen, damit sich A nicht selbst beschenkt. Z. B. Person E.
    Anschließend setzt sich die nächste Person davor und gibt ihren Namen ein. Person E steht nicht mehr zur Auswahl, d. h. der Zufallsgenerator wählt nun eine Person der noch Übrigen Leute. Usw...



  • Wie wäre es damit: Alle Teilnehmer werden in einem vector gesammelt, wie bisher auch. Dnn mischst du diesen vector kräftig durch. Nun beschenkt der Teilnehmer an Position i den Teilnehmer an Position i+1 (der Letzte muss den Kreis schließen und den Ersten beschenken)



  • Hi daddy_felix,

    das ist auch eine sehr gute Idee. Wie würde ich denn einen Vector mischen?
    Also welchen Code bräuchte ich dafür?

    Gruß
    Claudia



  • Da nimmst du std::experimental::shuffle bzw. std::random_shuffle()



  • @daddy_felix Es funktioniert zwar so, wie du es beschreibst, aber es ist keine völlig zufällige Ordnung mehr. Denn bei 4 Personen wäre auch möglich A->B, B->A, C->D, D->C, also 2 "Kreise", was aber bei deinem Algorithmus nie herauskommen kann.

    Kann man nicht jedem einen zufälligen anderen zuordnen (außer sich selbst) - und wenn am Ende nur noch man selbst überig bleibt, muss man 1x zuällig einen schon vergebenen ersetzen.

    Also:
    A zieht jetzt aus B,C,D; zieht zufällig C; also A->C
    B zieht jetzt aus A,D; zieht zufällig D; also A->C; B->D
    C zieht jetzt aus A,B; zieht zufällig A; also A->C; B->D; C->A
    D zieht jetzt aus B; zieht zufällig B; also A->C; B->D; C->A, D->B

    Oder:
    A zieht jetzt aus B,C,D; zieht zufällig B; also A->B
    B zieht jetzt aus A,C,D; zieht zufällig C; also A->B; B->C
    C zieht jetzt aus A,D; zieht zufällig A; also A->B; B->C; C->A
    D zieht jetzt aus [leer (nur D übrig, D kann aber nicht D ziehen)], muss also mit einem der vorher gezogenen zufällig tauschen



  • @spiri sagte in C++ - Bitte um Hilfe!:

    Da nimmst du std::experimental::shuffle bzw. std::random_shuffle()

    Wie kommst du auf experimental? std::shuffel ist seit C++11 definiert. std::random_shuffle ist seit C++14 veraltet und wurde in C++17 entfernt.