std::vector ... 6 Zahlen ermitteln und im Vecotr löschen



  • Bin lediglich Hobbyprogrammierer - also habt Nachsicht:

    Mein Programm soll einen Vector mit Zahlen von 1 bis 49 initialisieren
    Dann zufällig 6 Zahlen ermitteln und diese (und hier liegt das Problem) im Vector löschen.

    Mein Programm:

    #include <vector>
    #include <iostream>
    #include <ctime>
    
    using namespace std;
    
    int main()
    {
    	vector<int> liste;
    
    	srand(time(NULL));;				// Zufallszahlen vorbereiten
    
    	// Liste füllen mit Zahlen von 1 bis 49
    	for(int i = 1; i <= 49; i++)
    	{
    		liste.push_back(i);
    	}
    
    	// Zahl ziehen: ....
    	for(int i = 0; i < 6 ; ++i)
    	{
    		vector<int>::iterator it = liste.begin();	// it bei Position: 0
    
    		int zufall = rand() % 49 + 1;	// zufällige Zahl 1 - 49
    
    	    it += zufall;					// iterator die Position geben
    		cout << *it << endl;			// ausgeben
    		liste.erase(it);				// löschen
    	}
    
    	cout << endl;			// Leerzeile
    
    	// nach 6 Zahlen vector nochmals ausgeben .... hat das alles funktioniert ?
    	vector<int>::iterator it;
    	for(it = liste.begin(); it != liste.end(); ++it)
    	{
    		cout << *it << endl;
    	}
    
    }
    

    Bei der Ausführung gibt er mir gelegentlich (nicht immer) ein Segmention fault. Irgendwo scheine ich Grenzen zu überschreiten - kann mir jemand sagen wo?
    Gibt es eine elegantere Lösung das Umzusetzen ?



  • Wenn Du eine Zahl gezogen und gelöscht hast, solltest Du natürlich keine Zufallszahl mehr im Bereich bis 49 ziehen ...

    zB:

    int zufall = rand() % (49 - i) + 1;
    


  • Hallo morbidMo,

    Willlkommen im C++-Forum.

    Belli schrieb:

    Wenn Du eine Zahl gezogen und gelöscht hast, solltest Du natürlich keine Zufallszahl mehr im Bereich bis 49 ziehen ...

    zB:

    int zufall = rand() % (49 - i) + 1;
    

    Ist im Prinzip richtig , muss aber heißen:

    int zufall = rand() % (49 - i);
    

    'zufall' ist ein Index und läuft von 0..48 bzw. 0..48-i.

    Gruß
    Werner



  • Das stimmt natürlich! Hab mich so auf den von mir auf den ersten Blick gefundenen Fehler gestürzt, dass ich den zweiten Blick zu ungenau gemacht hab. 😞



  • Vielen Dank für die schnelle Hilfe!! Jetzt leuchtet mir das auch ein ! 👍


Anmelden zum Antworten