Ist zwar die Sache mit den Zufall aber nicht so wirklich!



  • Also ich hab folgendes Programm!

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <ctime> 
    using namespace std;
    
    int main()
    {
        int Teilnehmeranzahl;
        string Name[10];
        cout<<"Wieviel Personen nehmen teil?\n";
        cin>>Teilnehmeranzahl;
        for(int loop=0;loop<Teilnehmeranzahl;loop++)
        {
                cout<<"\nGeben Sie den Namen des "<<loop+1<<" Teilnehmer ein!\n";
                cin>>Name[loop];
        }
        srand( (unsigned)time( NULL ) );
        cout<<"\nEs treten an!\n";
        for(int loop1=0;loop1<Teilnehmeranzahl/2;loop1++)
        {
                cout<<Name[rand()%Teilnehmeranzahl]<<" vs. "<<Name[rand()%Teilnehmeranzahl]<<"\n";
                cout<<"Referee: "<<Name[rand()%Teilnehmeranzahl]<<"\n";
        }
        system("Pause");
    }
    

    Nun ist es so das manche Namen doppelt oder dreifach ausgegeben werden! Wie kann ich das verhindern???

    MfG

    Sascha081088



  • Hallo,

    Wie wär's, wenn du z.B. Folgendes machst:

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    #include <algorithm> // wird benötigt für random_shuffle.
    using namespace std;
    
    int main()
    {
        int Teilnehmeranzahl;
        string Name[10];
        cout<<"Wieviel Personen nehmen teil?\n";
        cin>>Teilnehmeranzahl;
        for(int loop=0;loop<Teilnehmeranzahl;loop++)
        {
                cout<<"\nGeben Sie den Namen des "<<loop+1<<" Teilnehmer ein!\n";
                cin>>Name[loop];
        }
        cout<<"\nEs treten an!\n";
    
        // Jedem Spieler eine eindeutige ID geben.
        vector<size_t> player_id(Teilnehmeranzahl);
        for(size_t i = 0; i < player_id.size(); ++i)
            player_id[i] = i;
    
        random_shuffle(player_id.begin(), player_id.end()); // diese IDS tauschen.
    
        for(int loop1=0;loop1 < Teilnehmeranzahl - 2; loop1 += 3)
        {
                // Spieler mit den jeweiligen IDs gegeneinander antreten lassen.
                cout<<Name[player_id[loop1]]<<" vs. "<<Name[player_id[loop1 + 1]]<<"\n";
                cout<<"Referee: "<<Name[player_id[loop1 + 2]<<"\n";
        }
        system("Pause");
    }
    

    Bzg. random_shuffle siehe hier.

    Eine erweiterte Fehlerüberprüfung und die Verschönerung dieser hingehackten Variante überlass ich dir :).

    btw:
    - du musst deine Zählvariablen nicht unterschiedlich benennen. (Sie sind in der jeweiligen Schleife lokal!).
    - system("Pause") ist bäh ;).

    Gruß Caipi



  • oder ganz simpel mit 2 dim array:
    ( im 2.ten feld einfach abhaken, ob der spieler schon gezogen wurde )

    allerdings musst du dir das mit dem schiedsrichter noch ueberlegen... 😉

    #include <iostream>
    #include <string>
    
    using namespace std;
    
        string Name[10][2];
        int Teilnehmeranzahl;
    
    string gezogen() {
       int i=rand()%Teilnehmeranzahl;
       while (Name[i][1]>"" ) 
          i=rand()%Teilnehmeranzahl;
    
       Name[i][1]="X";  //egal was>"" 
       return    Name[i][0];
    }
    
    int main()
    {
        cout<<"Wieviel Personen nehmen teil?\n";
        cin>>Teilnehmeranzahl;
        for(int loop=0;loop<Teilnehmeranzahl;loop++)
        {
                cout<<"\nGeben Sie den Namen des "<<loop+1<<" Teilnehmer ein!\n";
                cin>>Name[loop][0];
        }
        srand( (unsigned)time( NULL ) );
        cout<<"\nEs treten an!\n";
        for(int loop1=0;loop1<Teilnehmeranzahl/2;loop1++)
        {
                cout<<gezogen()<<" vs. "<<gezogen()<<"\n";
          // cout<<"Referee: "<<Name[rand()%Teilnehmeranzahl][0]<<"\n";
        }
        system("Pause");
    }
    


  • Hi,

    wenn man den Vorschlag von Caipi (random_shuffle) anwendet, kommt man auf eine ganz einfache Lösung:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cstdlib>
    #include <ctime>
    #include <algorithm>
    
    int main()
    {
    	std::srand( (unsigned)std::time( NULL ) );
    
    	size_t anzahl = 0;
    	std::cout << "Bitte die Anzahl der Spieler eingeben:" << std::endl;
    	std::cin >> anzahl;
    	std::vector<std::string> spieler;
    	for(std::size_t i = 0;i < anzahl;++i)
    	{
    		std::cout << "Namen fuer " << i+1 << " . Spieler angeben:" << std::endl;
    		std::string name = "";
    		std::cin >> name;
    		spieler.push_back(name);
    	}
    
    	std::random_shuffle(spieler.begin(), spieler.end());
    
    	for(int i = 0;i < anzahl;i += 2)
    	{
    		std::cout << spieler[i] << " vs. " << spieler[i + 1] << std::endl;
    	}
    
    	std::system("pause");
    
    	return 0;
    }
    

    Viel Spaß beim Ausprobieren. :xmas1:


Anmelden zum Antworten