jack-pott Geschrieben 14. Dezember 2010 Geschrieben 14. Dezember 2010 Tag, ich bin mir nicht sicher wie ich den Titel nennen soll, naja mal sehn. Also, ich habe folgendes Problem: Ich habe ein Array mit 20 Werten (Namen) jetzt will ich das 5x eine Konstellation von 4 Namen durch Zufall ausgewählt und ausgegeben wird. Hintergrund ist hier ein Sport- Wettkampf: Es gibt 20 Personen es spielen immer 2 gegen 2 und nach jeder Runde sollen alle Leute durcheinandergeworfen werden so dass möglichst nie 2 gleiche Leute zusammen oder gegeneinander spielen. Es gibt 5 Runden und in jeder Runde 6 Spielfelder, also 6 x 4 Personen die bestimmt werden müssen. Zu einfachheithalber habe ich keine Namen sondern erstmal nummern ins Array geschrieben, hier ist mein Ansatz: Es läuft 5x die Schleife durch in der jeweils 4 Personen ausgewählt werden und das wird ausgegeben. for(int j = 0;j<5;++j){ for(int i = 0;i<2;++i){ zufall = (rand() % 20) +1; cout << namen[zufall] << endl; } cout << "spielen gegen: " << endl; for(int i = 0;i<2;++i){ zufall = (rand() % 20) +1; cout << namen[zufall] << endl; } cout << "-----" << endl; } Das Problem dabei ist folgendes: Ich weis nicht so recht wie ich verhindern soll das Personen doppelt genommen werden, die Idee war alle gewählten Zahlen in ein Array zu schreiben wo jedesmal bei der Zufalls Zahl abgeglichen wird ob diese bereits verwendet wurde. Das würde das Problem für 1 Runde lösen. Wie ich es aber hinbekommen kann das in der 2ten Runde nicht die selben gegeneinander spielen hab ich keine Ahnung, irgendwie müsste man die Zahlenpaare irgenwo aufschreiben und immer abgleichen. Vielleicht hat jemand von euch einen Tipp. Danke Zitieren
_n4p_ Geschrieben 14. Dezember 2010 Geschrieben 14. Dezember 2010 statt eines arrays würde ich eine, bzw mehrere, liste(n) nutzen. aus denen würde ich jeweils das gerade ermittelte element entfernen. dann müssten auch die zufallszahlen anhand der größe der liste ermittelt werden. bei 20 personen und 6 spielfeldern die mit je 4 personen besetzt sein müssen, hast du aber prinzipiell ein problem. nach dem 5ten spielfeld gehen dir die leute aus. als nächstes musst du dir merken wer gegen und mit wem gespielt hat, was wohl zu einer personen-klasse führen wird. Zitieren
jack-pott Geschrieben 14. Dezember 2010 Autor Geschrieben 14. Dezember 2010 bei 20 personen und 6 spielfeldern die mit je 4 personen besetzt sein müssen, hast du aber prinzipiell ein problem. nach dem 5ten spielfeld gehen dir die leute aus. Das ist ja ein Organisatorisches Problem, 6 Felder ist ja ein Maximum und muss nicht ganz ausgenutzt werden. Ausserdem will ich es am Ende so schreiben das eine beliebige Anzahl von Leute gewählt werden kann, aber das kommt wenn cih fertig bin dazu. Ich schau mir das mit Listen mal an, hab damit noch gar keine Erfahrung, die nächsten Fragen zu den Listen stell ich dann auch einfach hier. danke. Zitieren
Klotzkopp Geschrieben 14. Dezember 2010 Geschrieben 14. Dezember 2010 Mit der Funktion std::random_shuffle kannst du dein Array schön durchmischen. Um aber wirklich Wiederholung so weit wie möglich zu vermeiden, musst du vom Zufall weg und dir etwas anderes überlegen. Für 20 Leute reicht ein einfaches Rotationsschema: Nennen wir die Positionen bei einer Begegnung A, B, C und D. Dann wird nach jeder Runde folgendermaßen rotiert: Die Spieler auf A bleiben, wo sie sind. Die Spieler auf B gehen ein Spielfeld weiter, die Spieler auf C zwei Spielfelder und die auf D drei Spielfelder. Dabei sollte sich eigentlich nichts wiederholen, wenn ich mich nicht verrechnet habe. Zitieren
jack-pott Geschrieben 14. Dezember 2010 Autor Geschrieben 14. Dezember 2010 Für 20 Leute reicht ein einfaches Rotationsschema: Ja, aber es gibt keine festen Teams, also alle Spieler werden wieder durchgemischt zu neuen Teams, das wäre eine ewige Kleinarbeit alle Konstellationen zu überlegen, das wollte ich ja von nem Programm übernehmen lassen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.