Mehrfachziehung einer Frage bei einem Quiz



  • Hallo Cpp Community,
    Ich habe folgendes Problem. Ich bin cpp Anfänger und bin gerade dabei ein Quiz Programm zu schreiben. Es wird einer Variable ein Zufallswert zugewiesen und mit der ich dann fragen und antworten aus einem string Array ziehe. Das Problem Dabei ist das Fragen und Antworten doppelt gezogen werden können.

    Wie kann ich das Verhindern?
    Hier der Code:

    int zahl = -500;
    	char antwort;
    	int ziehung;
    	time_t t;
    	string fragen[4] = {"Welche ist die Hauptstadt von Italien?", "Wie viele Einwohner leben in Italien?", "Welche ist die Hauptstadt von Suedtirol?", "Welches ist das Weltbild indem die Sonne im Mittelpunkt des Universums steht?"};
    	string antworten[4] = {"A: Rom   B: Wien   C: Meran   D: Paris", "A: 20 mio   B: 40 mio  C: 50 mio   D: 60 mio", "A: Lana   B: Meran   C: Bozen   D: Brixen", "A: Geozentrische   B: Heliozentrische   C: Galaktozentrische   D: Multiversum"};
    
    	cout << "DAS MILLIONEN-QUIZ" << endl << endl;
    
    	if (zahl == 5000)
    	{
    		cout << "Sie haben Gewonnen" << endl;
    		system("PAUSE");
    		return 0;
    
    	}
    
    	zahl = zahl + 500;
    
    	srand((unsigned) time(&t));
    	ziehung = (rand() % 3 + 1);
    
    	cout << "Beantworten sie die Folgende Frage" << endl;
    
    		cout << zahl << " Euro: " << endl << fragen[ziehung] << endl << endl;
    		cout << "Antwortmoeglichkeiten: " << endl << antworten[ziehung] << endl;
    		cout << "Geben sie die Antwort ein: ";
    

    Ich hoffe ihr könnt mir helfen.
    lg max



  • Vor der nächsten Ziehung vertauschst Du die gezogene Frage/Antwort mit der letzten Frage/Antwort im entsprechenden Array und ziehst dann aus einem um 1 verringerten Array.



  • Dankeschön, Funzt richtig gut,

    lg max


  • Mod

    Drei Strategien:
    1. Quick & Dirty1: Liste der Indizes erstellen, std::random_shuffle darüber laufen lassen, Liste der Reihe nach durchgehen, bis Ende oder bis gewünschte Zahl Fragen gestellt wurde.
    2. Quick & Dirty2: In einer Liste die schon gezogenen Indizes merken, bei jeder Frage so lange neue Zufallszahlen ziehen, bis die Zahl nicht in der Liste der schon gestellten Fragen ist.
    3. Die algorithmisch schöne, aber komplizierter umzusetzende Lösung: Liste der Indizes erstellen, Zufallszahl von 0 bis Listengröße ziehen, Index an dieser Stelle nutzen. Dann Index mit letztem Index in der Liste vertauschen, dann das letzte Element von der Indexliste streichen. Fortfahren von vorne, bis Liste keine Elemente mehr enthält oder bis gewünschte Zahl Fragen gestellt wurde.

    Methode 1 ist besonders effizient, wenn die Zahl der zu stellenden Fragen ähnlich groß ist wie die Zahl der zur Verfügung stehenden Fragen und sehr ineffizient, wenn die Zahl der zur Verfügung stehenden Fragen sehr groß gegen die Zahl der zu stellenden Fragen ist.
    Methode 2 ist genau umgekehrt.
    Methode 3 ist in allen Fällen ganz ok, kann aber jeweils ineffizienter als Methoden 1 und 2 sein, wenn diese in ihrem besonders effizienten Bereich sind.



  • Danke für eure Hilfe, ich habe es mit Methode 1 gemacht.

    lg max


Log in to reply