Einmalig zufälliges Wort aus Liste auswählen



  • Hi, Leute.

    Ich habe ein Problem mit einem Zufalls-Generator. Und zwar habe ich das Ziel, Wörter einzugeben (z.B. Namen oder Orte), die mir dann per Zufall in die Konsole geschrieben werden sollen. Mein Code sieht bisher so aus:

    int main()
    {
    do
    {
    	char const* woerter[] = { "Ingo", "Phillip", "Klaus", "Günther", "Harald", "Peter" };
    	int wort_anzahl = sizeof(woerter) / sizeof(woerter[0]);
    	int zahl = (rand() % wort_anzahl);
    
    	puts(woerter[zahl]);
    	system("PAUSE");
    } while (1);
    
    }
    

    An und für sich klappt das schon relativ gut, allerdings gibt mir die Konsole wirklich zufällig alles auch und - das ist das Hauptproblem - auch zweimal hintereinander dasselbe. Es wird zum Beispiel 2x Klaus ausgegeben. Wie kann ich das Programm nun so ändern, dass ich jeden Array-Bestandtteil nur einmal ausgegeben bekomme? Ähnlich wie der Shuffle-Modus eines Players? Sprich: Bevor der erste Name wieder auftaucht, müssen erst alle anderen Namen schon ausgegeben worden sein.

    Danke im Voraus und liebe Grüße 🙂



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Eine einfache Idee wäre:

    N = Die Gesamtzahl der Wörter zu Beginn
    Schleife:
    {
      R = Zufällige Zahl von 0 (inklusiv) bis N (exklusiv)
      Gib Wort Nummer R aus
      Vertausche Wort Nummer R mit Wort Nummer N-1
      Erniedrige N um 1
    }
    


  • Ich verstehe nicht, was dieser Austauch der beiden Wörter zu bedeuten hat, bzw. warum vertauscht man die Gesamtanzahl, die mit jeder Zählung mit 1 Subtrahiert wird, mit dem Zufällig angesteuertem Wort? 😕


  • Mod

    Schreib ein paar Wörter auf Papier, scheide sie aus, Ordne sie auf dem Tisch an, schnapp dir ein paar Würfel und folge ganz genau den Anweisungen.

    PS: Es muss natürlich mit dem (N-1)ten Wort getauscht werden, da wir schließlich bei 0 anfangen mit dem Wortindex.



  • Ich komme so langsam hinter deine Taktik. Jedes Mal, wenn ein Wort gewählt wurde, tritt es an letzte Stelle, die Gesamtanzahl wird um 1 Reduziert und somit fällt das Wort außerhalb des definierten Bereiches. Sehr geniale Erklärung, bzw. Denkansatz! 🙂



  • Leider Funktioniert mein Programm immer noch nicht wirklich, wegen den Datentypen...

    Das Array besteht ja aus Wörtern, aber diese werden in deinem Beispiel ja als Zahlen behandelt 😞

    Ich kann dir mal Zeigen, was bisher dabei herausgekommen ist:

    Das ist mein code jetzt:

    int main()
    {
    	do
    	{
    		int Anzahl = 5;
    		for (int i = 0; i < 5; i++)
    		{
    			char const* Buchstabe[] = { "A", "B", "C", "D", "E" };
    			int Buchstabe_Anzahl = sizeof(Buchstabe) / sizeof(Buchstabe[0]);
    			int Gewaehlt = (rand() % Buchstabe_Anzahl);
    			puts(Buchstabe[Gewaehlt]);
    			int temp = Buchstabe[Gewaehlt];
    			Buchstabe[Gewaehlt] = Buchstabe[Anzahl - 1];
    			Buchstabe[Anzahl - 1] = temp;
    
    			system("PAUSE");
    		}
    } while (1);
    
    }
    

    Habe ich gerade einen groben denkfehler? Sorry, ich weiß, das ist eigentlich eine ANfängerfrage sondergleichen, aber ich verstehe es einfach nicht 😞



  • Thollanhar schrieb:

    [..] die Gesamtanzahl wird um 1 Reduziert [..]

    Das ist der Knackpunkt...


  • Mod

    Zeile 12 weist du einem Integer einen Zeiger zu. In deinem Array stehen Zeiger auf char. Die kann man zwar auch einfach vertauschen, aber du musst schon den richtigen Typen benutzen. Außerdem hast du vergessen, die Gesamtzahl nach jedem Durchlauf um 1 zu verringern.

    Wenn ich die beiden Fehler berichtige und zu Demonstrationszwecken die Endlosschleife weglasse, erhält man:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char const* Buchstabe[] = { "A", "B", "C", "D", "E" };
        int Anzahl = sizeof(Buchstabe) / sizeof(Buchstabe[0]);
        while(Anzahl > 0)
        {
            int Gewaehlt = (rand() % Anzahl);
            puts(Buchstabe[Gewaehlt]);
            char* temp = Buchstabe[Gewaehlt];
            Buchstabe[Gewaehlt] = Buchstabe[Anzahl - 1];
            Buchstabe[Anzahl - 1] = temp;
            --Anzahl;
        }
    }
    

    http://ideone.com/LdH6Rz


Anmelden zum Antworten